有人能告诉我"旧式"对象构造函数与"新式"构造函数有何不同?我正在学习PHP OOP,我想知道我何时阅读旧语法和新语法,并且更好地了解OOP随着时间的推移如何在PHP中发生变化.
新风格
class aObject { public $name; public function __construct($name) { $this->name = $name; } }
Will.. 11
"旧"构造函数语法指的是PHP4.PHP4的最后一个版本是在2008年,PHP5的第一个版本是在2004年.这是一个旧式类和一个新式类的例子.
老(PHP4)
foo = $foo; } function notAConstructor() { /* ... */ } }
新(PHP5 +)
foo = $foo; } public function notAConstructor() { /* ... */ } }
你会注意到这里的一些事情.最重要的变化是命名构造函数的规范方法已从更改ClassName()
为__construct()
.这为所有类构造函数提供了相同的,可预测的名称 - 一个必要的便利.想象一下,你有一个叫ParentClass
20个孩子的班级,每个孩子都有自己的建设者.如果你想从每个子类调用父构造函数,你可以调用ParentClass::ParentClass()
.如果要更改名称ParentClass
,则必须更改所有20个构造函数调用.但是,使用新方法,parent::__construct()
即使父类的名称发生更改,您也只需调用即可.
与此更改相关,PHP5还引入了类析构函数(__destruct()
),它在对象被销毁时调用(与构造函数相反).
另一个关键变化是PHP5引入了方法和属性可见性,它允许对类的方法和属性进行某种"访问控制".只能public
从类或其子项外部的上下文中访问标记为cam的方法和属性.以下是此示例:
publicProperty = 10; * echo $so->publicProperty; * * Or from inside the class: * $this->publicProperty = 5; * echo $this->publicProperty; */ public $publicProperty = 1; /* This can be accessed only from methods inside this class. * * $this->privateProperty = 5; * echo $this->privateProperty; * * You cannot access it from outside the class, as above. * Private properties cannot be accessed from child classes, * either. */ private $privateProperty = 2; /* This can be accessed only from methods inside this class, * OR a child-class. * * $this->protectedProperty = 5; * echo $this->protectedProperty; * * You cannot access it from outside the class, as with public. * You can, however, access it from a child class. */ protected $protectedProperty = 3; }
现在,方法的工作方式完全相同.您可以标记一个类中的一个函数(方法)public
,private
或protected
.在PHP4中,所有类成员都是隐式的public
.同样,一个构造函数(__construct()
),也可以是public
,private
或protected
!
如果一个类不包含公共构造函数,则不能通过类外部的代码(或其子代protected
)来实例化它.那你怎么用这样的课呢?那么,静态方法,当然:
foo = $foo; } public static function fromBar($bar) { $foo = do_something_to($bar); return new self($foo); } }
要从其他地方实例化这个类,你可以调用:
$obj = ClassWithPrivateConstructor::fromBar($bar);
当您需要在调用构造函数之前预处理输入,或者需要多个采用不同参数的构造函数时,这可能很有用.
这种方法的名称,__construct()
以及其他方法的名字打头的__
,像__get()
,__set()
,__call()
,__isset()
,__unset()
,__toString()
,等被称为魔术方法.
PHP5带来了很多戏剧性的变化,但很大程度上试图保持与PHP4代码的兼容性,因此,仍然允许旧式构造函数.
PHP7现已在今年发布,没有对构造函数语法进行任何更改.class
PHP7中唯一重要的相关变化是允许使用匿名类(参见此处).
从PHP7开始,旧式构造函数被正式弃用(引发E_DEPRECATED
错误),并将在PHP8中完全删除.
"旧"构造函数语法指的是PHP4.PHP4的最后一个版本是在2008年,PHP5的第一个版本是在2004年.这是一个旧式类和一个新式类的例子.
老(PHP4)
foo = $foo; } function notAConstructor() { /* ... */ } }
新(PHP5 +)
foo = $foo; } public function notAConstructor() { /* ... */ } }
你会注意到这里的一些事情.最重要的变化是命名构造函数的规范方法已从更改ClassName()
为__construct()
.这为所有类构造函数提供了相同的,可预测的名称 - 一个必要的便利.想象一下,你有一个叫ParentClass
20个孩子的班级,每个孩子都有自己的建设者.如果你想从每个子类调用父构造函数,你可以调用ParentClass::ParentClass()
.如果要更改名称ParentClass
,则必须更改所有20个构造函数调用.但是,使用新方法,parent::__construct()
即使父类的名称发生更改,您也只需调用即可.
与此更改相关,PHP5还引入了类析构函数(__destruct()
),它在对象被销毁时调用(与构造函数相反).
另一个关键变化是PHP5引入了方法和属性可见性,它允许对类的方法和属性进行某种"访问控制".只能public
从类或其子项外部的上下文中访问标记为cam的方法和属性.以下是此示例:
publicProperty = 10; * echo $so->publicProperty; * * Or from inside the class: * $this->publicProperty = 5; * echo $this->publicProperty; */ public $publicProperty = 1; /* This can be accessed only from methods inside this class. * * $this->privateProperty = 5; * echo $this->privateProperty; * * You cannot access it from outside the class, as above. * Private properties cannot be accessed from child classes, * either. */ private $privateProperty = 2; /* This can be accessed only from methods inside this class, * OR a child-class. * * $this->protectedProperty = 5; * echo $this->protectedProperty; * * You cannot access it from outside the class, as with public. * You can, however, access it from a child class. */ protected $protectedProperty = 3; }
现在,方法的工作方式完全相同.您可以标记一个类中的一个函数(方法)public
,private
或protected
.在PHP4中,所有类成员都是隐式的public
.同样,一个构造函数(__construct()
),也可以是public
,private
或protected
!
如果一个类不包含公共构造函数,则不能通过类外部的代码(或其子代protected
)来实例化它.那你怎么用这样的课呢?那么,静态方法,当然:
foo = $foo; } public static function fromBar($bar) { $foo = do_something_to($bar); return new self($foo); } }
要从其他地方实例化这个类,你可以调用:
$obj = ClassWithPrivateConstructor::fromBar($bar);
当您需要在调用构造函数之前预处理输入,或者需要多个采用不同参数的构造函数时,这可能很有用.
这种方法的名称,__construct()
以及其他方法的名字打头的__
,像__get()
,__set()
,__call()
,__isset()
,__unset()
,__toString()
,等被称为魔术方法.
PHP5带来了很多戏剧性的变化,但很大程度上试图保持与PHP4代码的兼容性,因此,仍然允许旧式构造函数.
PHP7现已在今年发布,没有对构造函数语法进行任何更改.class
PHP7中唯一重要的相关变化是允许使用匿名类(参见此处).
从PHP7开始,旧式构造函数被正式弃用(引发E_DEPRECATED
错误),并将在PHP8中完全删除.