为什么PHP对象接受在调用时才提到的成员?

时间:2014-08-05 07:03:46

标签: php oop

我对以下代码片段感到矛盾,我不知道该怎么称呼它。

我已经定义了一个非常简单的类,它还没有变量。现在,在构造函数中,我接受一个键和值数组,并使用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

这怎么可能?

2 个答案:

答案 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