何时在PHP中使用类与函数

电灯泡还没有继续这个…

我真的很喜欢一个容易理解的解释,使用一个类的function在PHP的优势。

下面是我现在想的一个简单例子,我想知道一个类是否更有效率:

假设我有一个使用php构build的迷你日历小部件。 我正在考虑调用函数miniCal('arrayVars1', 'var2') 。 但是我可能会在这个页面上做两次。 通过在这里使用一个类来使用更less的资源,创build新的实例?

我应该在这里叫什么树,因为我现在觉得这棵树是一堵砖墙。

类用于将数据表示为对象。 如果您代表的是用户数据或拍卖出价,则创buildUser对象或AuctionBid对象可以更轻松地将这些数据保存在一起,在代码中传递,并使读者更容易理解。 这些类将具有属性(如数字,string或其他对象的数据字段)以及方法(您可以在任何类上操作的函数)。

课程通常不会在性能方面提供任何好处,但是它们也很less有任何负面影响。 他们真正的好处是使代码更清晰。

我build议你阅读PHP5面向对象编程指南和维基百科OOP条目 。

从PHP5开始,一个常见的事情就是创build类库, 这为您提供了组织您的function和利用类function(如__autoload();

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

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

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

这样做的好处是:

  1. 您的encryptionfunction分组在一起并组织。 你和任何维护代码的人都知道在哪里可以find你的encryptionfunction。
  2. 这是非常清楚,容易阅读。 良好的可维护性。
  3. 你可以使用__autoload()来自动包含你的类。 这意味着你可以像使用内置函数一样使用它。
  4. 因为它被包含在它自己的类和自己的文件中,所以它是可重用的,并且可以很容易地移植到新的项目中。

使用类是分组函数的好方法。

区别在于编程范例的使用。 OOP中的类是必要的,但在程序范式中不是必需的。 在程序范例中,您可以将函数分组到一个文件中,这可以看作是一个模块。

—编辑—

你可以使用程序范式 。 这个范例中并不需要类。

 function miniCal($string_1, $string_2){ //do something } //invoke function miniCal('arrayVars1', 'var2'); 

你可以使用OOP范例 。 类是需要的。

 class Calculation { public static function miniCal($string_1, $string_2){ //do something } } //invoke function Calculation::miniCal('arrayVars1', 'var2'); 

结论

这两个范例的工作,但上面的OOP示例是使用包含所有计算方法(函数)的计算对象。 计算对象将计算函数分组,从而将它们保持在一个位置。

这个例子中的面向对象范例服从于一个被称为“坚实的责任”的原则。 这背后的想法是保持代码优雅,维护和可读性。

function是你的应用程序的肉,类更像板。 没有盘子吃肉是很麻烦的。 但如果你没有肉,你就没有吃饭。

如果您的应用程序中有500个函数,则可能需要将其中至less一半分组到更大的集合中以便于访问。 你可以devise通用的命名约定(“Encryption_Encrypt”,“Encycryption_Decrypt”等),但类更容易。 如果您的应用程序只有12个function,那么您可能只有1个或多个类(如果有)。

我经常不需要在类中存储数据/属性。 我倾向于将这些存储在数据库中。 所以我没有经常利用课堂的这个方面。

类也允许多态,这可能是有帮助的。 如果你有几个非常相似的类,或者是一个类的几个变种,你可以节省代码…而不需要构build一个多用途的,类科学怪人的类。

我有一个地方你会使用OOP风格类在我的​​答案这个问题的列表: https : //stackoverflow.com/questions/2035449/why-is-oop-hard-for-me/2035482#2035482

基本上,只要你想表示一个有事物的对象。 就像一个数据库variables,它有一个唯一的连接。 所以我会存储,所以我可以确保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); } } 

或者,也许你想build立一个表单,你可以创build一个表单对象,它包含一个input列表,当你决定显示它的时候,你想要在表单里面:

 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"); 

或者像其他人所build议的那样,一个人:

 class Person{ public $name; public $job_title; // ... etc.... } 

所有这些都是创build类的理由,因为它们表示具有诸如名称或职位等属性的东西,并且可能具有诸如显示表格之类的方法。

基本上都做同样的工作,但通过使用类,你可以更容易地pipe理你的代码,另外一件事,如果我们使用类,那么我们必须创build对象来调用定义在其中的函数,而如果我们直接创build函数,那么我们不需要创build对象。