在PHP中何时使用类(class)和函数(function)?

68

对于这个问题,我真的很想得到一个易于理解的解释,说明在php中使用类的优势而不仅仅是使用函数。

下面是我目前正在思考的一个简单示例,并且想知道类是否更有效:

假设我已经在php中构建了一个迷你日历小部件。我考虑调用函数miniCal('arrayVars1', 'var2')。但这可能会在该页面上调用两次。通过在此处使用类,创建新实例,可以使用更少的资源吗?

我应该追求哪个方向,因为我感觉现在这个方向是一堵墙...

6个回答

61

类用于将数据表示为对象。如果您要表示类似于用户数据或拍卖竞标的内容,创建User对象或AuctionBid对象可以更轻松地将数据组合在一起,在代码中传递它,并使其更易于理解。这些类将具有属性(数据字段,如数字、字符串或其他对象)以及方法(可以对任何类执行操作的函数)。

类通常不会在性能方面提供任何好处,但它们很少会产生任何负面影响。它们真正的好处在于使代码更清晰。

我建议您阅读PHP5面向对象编程指南维基百科面向对象编程条目


如果你将面向对象编程的预课原则应用于面向对象编程的后续版本,你就可以使用全局/局部设置变量。 - a coder

41

自 PHP5 开始,常见的做法是创建充当库的类。这样做可以让您更好地组织功能,并利用类特性(如 __autoload())。

例如,假设您有两个加密和解密数据的函数。您可以将它们封装在一个类中(我们称之为 Encryption),并使它们成为静态函数。然后,您可以像这样使用这些函数(注意不需要初始化(即 $obj = new Encryption)):

$encrypted_text = Encryption::encrypt($string);

并且

$decrypted_text = Encryption::decrypt($string);

这样做的好处有:

  1. 你的加密功能被分组并组织得当。你和任何维护代码的人都知道在哪里找到你的加密功能。
  2. 这非常清晰易读,有利于可维护性。
  3. 你可以使用__autoload()自动包含类。这意味着你可以像使用内置函数一样使用它。
  4. 因为它包含在自己的类和文件中,所以它是可重用的,并且可以轻松地移植到新项目中。

你有这个好用函数的更多使用信息吗?谢谢! - Miguel Stevens
@MiguelStevens 请查看此答案以获取代码。 - John Conde
谢谢!但我指的是不需要声明的类的一般用法? :) 我是面向对象编程的半新手 - Miguel Stevens

12

使用类是将函数分组的好方法。问题是哪些函数应该归为一类?您可能听说过“低耦合,高内聚”。在这篇文章中,让我们关注高内聚

假设您有几个函数,并且它们执行某些相关联的计算。就像这样:

function plus1($a){
    return $a + 1;
}

function plus2($a, $b){
    return $a + $b;
}

function plus3($a, $b, $c){
    return $a + $b + $c;
}

function plus4($a, $b, $c, $d){
    return $a + $b + $c + $d;
} 

将相关的函数分组是有意义的。

class PlusCalculator {

    public function plus1($a){
        return $a + 1;
    }
    
    public function plus2($a, $b){
        return $a + $b;
    }
    
    public function plus3($a, $b, $c){
        return $a + $b + $c;
    }
    
    public function plus4($a, $b, $c, $d){
        return $a + $b + $c + $d;
    }
}

那么什么时候应该使用类而不是函数呢? 答案在于编程范式和风格的使用。 类在面向对象编程中是必要的,但在过程式编程中则不太必要。在纯函数式编程语言中,你没有类。

但在面向对象编程语言中,我会说当函数之间有一定的关联性时,将它们分组为一个类


8
函数是应用程序的主要部分,而类更像是盘子。没有盘子吃肉会很乱。但是如果您没有任何肉,就没有食物。
如果您的应用程序中有500个函数,您可能至少想将其中的一半分组成更大的集合以便于访问。 您可以设计通用命名约定(“Encryption_Encrypt”,“Encycryption_Decrypt”等)......但是类更容易使用。 如果您的应用程序中只有12个函数,那么您可以仅使用1个或不使用类来存活。
我通常不需要在类中存储数据/属性。 我倾向于将它们存储在数据库中。 因此,我很少利用类的这方面。
类还允许多态,这可能很有帮助。 如果您有几个非常相似的类,或者对类进行了几个变化,您可以节省代码......而不必构造一些多功能的类。

3
我在回答这个问题时列出了一些使用OOP风格类的地方清单:https://stackoverflow.com/questions/2035449/why-is-oop-hard-for-me/2035482#2035482 基本上,每当您想要表示一个包含内容的对象时,就可以使用面向对象编程(OOP)。例如,数据库变量中包含唯一连接的情况,我会将其存储起来,以确保每次mysql_query都使用正确的连接:
class MySQL extends Database
{
    public function connect($host, $user, $pass, $database)
    {        
        $this->connection = mysql_connect($host, $user, $pass);
        $this->select_db($database);
    }

    public function query($query)
    {
        return mysql_query($query, $this->connection);
    }

    public function select_db($database)
    {
        mysql_select_db($database);
    }    
}

也许您想要构建一个表单,您可以创建一个包含输入框等要素的表单对象,并在决定显示它时将其放入表单中:

class Form
{
    protected $inputs = array();
    public function makeInput($type, $name)
    {
         echo '<input type="'.$type.'" name="'.$name.'">';
    }

    public function addInput($type, $name)
    {
         $this->inputs[] = array("type" => $type,
                "name" => $name);
    }

    public function run()
   {
       foreach($this->inputs as $array)
       { 
          $this->makeInput($array['type'], $array['name'];
       }
    }
}

$form = new form();

$this->addInput("text", "username");
$this->addInput("text", "password");

或者像其他人建议的那样,一个人:
class Person{

    public $name;
    public $job_title;
    // ... etc....

}

创建类的原因在于它们代表具有属性(如名称或职称)和可能具有方法(例如显示表单)的事物。


1
addInput函数和下面的代码有什么不同呢?function addInput($type, $name) { echo '<input type="'.$type.'" name="'.$name.'">'; } addInput("text", "username"); addInput("text", "password"); - Andy Gee
1
编写生成HTML标签的代码是一个非常糟糕的例子。这只会使你的代码更难读懂。如果你必须使用代码来生成HTML,正如@AndyGee建议的那样,他的示例函数要简单得多。但即便如此,那个函数也因为没有充分的理由而被隐藏在其他文件中的某个地方。 - Jay
3
99%的情况下,类和函数不应该输出任何东西。它们返回数据,由模板或其他组件处理。一旦你拥有40个或更多的类,你就会失去对于输出内容的追踪和控制,因为它不是可能的输出结果,而是实际的输出结果。这样会导致你失去布局和样式的控制。比如说,如果你的模板输出HTML,然后调用一个输出其他内容和更多数据的类,那么如果你想把来自该类的数据分成单独的段落,你就需要在类中硬编码<p>标签。如果数据被用于其他地方,并不需要单独的段落呢? - James

1

基本上,两者都可以完成相同的工作,但是使用类可以更轻松地管理代码。另外,如果我们使用类,则必须创建对象来调用其中定义的函数,而如果我们直接创建函数,则不需要创建对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接