我对以下代码片段感到矛盾,我不知道该怎么称呼它。
我已经定义了一个非常简单的类,它还没有变量。现在,在构造函数中,我接受一个键和值数组,并使用foreach循环动态分配变量:
class Food{
function Food($construct){
foreach($construct as $key=>$value){
$this->$key = $value;
}
}
}
如果我现在用这样的输入创建了一个实例:
$food = new Food(array('name' => 'chicken' , 'unit' => 'kg' , 'calorie' => 10000));
我会得到:
var_dump($food);
object(Food)[1]
public 'name' => string 'chicken' (length=7)
public 'unit' => string 'kg' (length=2)
public 'calorie' => int 10000
这怎么可能?
答案 0 :(得分:3)
这在PHP中是可能的,并且是默认实现,除非您另有说明(通过__get()和__set())。动态创建公共成员只能用于当前实例,它不会为整个类创建它。它可以从课堂内部或外部(例如通过实例)。
$food->smth = 100;
将创建public smth
空__set()
魔术方法可以防止此行为
public function __set($name, $value) { }
关于第二个问题:
这是不安全的,使用公共成员是不安全的(除非你有充分的理由揭露你的财产)。该惯例表明,您必须拥有大多数私人/受保护成员,并为其提供访问者。因此,您可以从类内部而不是从实例中获取类的控件。还有许多其他原因,包括代码可重用性。
答案 1 :(得分:2)
该变量未初始化,它只是未声明的。
在类定义中声明变量是可读性的一种风格。另外,您可以设置辅助功能(私人或公共)。
无论如何,明确声明变量与OOP无关,OOP是特定于编程语言的。在Java中,您无法做到这一点,因为必须明确声明变量。
参考 - http://stackoverflow.com/questions/1086494/when-should-i-declare-variables-in-a-php-class