ezp*_*sso 22 php constructor initialization class
将数组声明为类成员时,应该采用哪种方式?
class Test1 {
private $paths = array();
public function __construct() {
// some code here
}
}
Run Code Online (Sandbox Code Playgroud)
要么
class Test2 {
private $paths;
public function __construct() {
$this->paths = array();
// some code here
}
}
Run Code Online (Sandbox Code Playgroud)
在良好实践和绩效方面哪一个更好?你会推荐什么?
Mch*_*chl 10
我建议在声明一个类变量时这样做.构造函数可以在扩展类中重写,如果你的任何函数依赖于这个变量是一个数组(甚至是一个空数组),这可能会导致E_NOTICEs甚至E_WARNINGs
如果要在初始化期间动态填充数组,请在构造函数中执行此操作.如果它包含固定值,请在属性声明中执行.
尝试在声明中动态填充数组(例如,通过使用某个函数或方法的返回值)会导致解析错误:
// Function call is not valid here
private $paths = get_paths();
Run Code Online (Sandbox Code Playgroud)
由于每个都有自己的用例,因此性能不是真正关注的问题.
一般来说,因为除了PHP之外我主要用其他语言编写,我喜欢在构造函数之外声明我的实例变量.这让我看一下类的顶部,并了解所有属性及其访问修饰符,而无需阅读代码.
例如,我真的不喜欢这样的方法
// ...
// whole bunch of code
// ...
public function initialize() {
$this->foo = array();
// some other code to add some stuff to foo
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我只是看一下这个类,我不能确定有一个变量foo甚至可用.如果有,我不知道我是否可以从实例外的任何地方访问它.
如果相反,我有:
public $foo = array();
Run Code Online (Sandbox Code Playgroud)
在我的班级顶部,我知道foo是一个实例属性,我可以从其他地方访问它.