2013-01-14 105 views
0

例如两者有什么不同?一个人喜欢另一个人吗?在构造函数内部或外部声明变量之间的区别?

Class Node{  
    public $parent = null; 
    public $right = null; 
    public $left = null;    
    function __construct($data){ 
     $this->data = $data;      
    } 
} 

Class Node{  
    function __construct($data){ 
     $this->data = $data;  
     $this->parent = null;  
     $this->left = null;  
     $this->right = null;    
    } 
} 

回答

6

有一定的差别,是:

#1:类没有被正式视为具有这些属性,如果你只在构造函数中

Example定义它们:

class Foo { 
    public $prop = null; 
} 

class Bar { 
    public function __construct() { 
     $this->prop = null; 
    } 
} 

var_dump(property_exists('Foo', 'prop')); // true 
var_dump(property_exists('Bar', 'prop')); // false 

$foo = new Foo; 
$bar = new Bar; 

var_dump(property_exists($foo, 'prop')); // true 
var_dump(property_exists($bar, 'prop')); // true 

除了不同的运行时行为,使用构造函数来“添加”属性你的班级。如果你打算所有这个类的对象有财产(实际上应该几乎所有的时间),那么你也应该正式宣布它们。 PHP允许你摆脱这个事实并不能成为偶然类设计的借口。

#2:不能从构造外

实施例初始化属性以非恒定的值:

class Foo { 
    public $prop = 'concatenated'.'strings'; // does not compile 
} 

More examples关于该约束在PHP手册提供。

#3:对于在构造函数中初始化值,如果一个派生类忽略调用父类的构造结果可能是意外

Example

class Base { 
    public $alwaysSet = 1; 
    public $notAlwaysSet; 

    public function __construct() { 
     $this->notAlwaysSet = 1; 
    } 
} 

class Derived extends Base { 
    public function __construct() { 
     // do not call parent::__construct() 
    } 
} 

$d = new Derived; 
var_dump($d->alwaysSet); // 1 
var_dump($d->notAlwaysSet); // NULL 
+1

感谢Jon,我非常感谢你所有的代码示例以及指向php记事本的链接 – user784637

0

我喜欢宣称他们的超出了我有几个原因的构造函数。

  1. 让我的构造函数干净
  2. 这样我就可以正确记录他们,加入类型信息和喜欢
  3. ,所以我可以指定访问修饰符,使他们私有或受保护的,但很少,如果公共
  4. 所以他们也将被宣布和/或初始化如果派生类不调用父:: __结构()

即使我需要将它们初始化到非恒定值,我将宣布他们出我的构造函数,并在我的构造函数中初始化它们。

相关问题