为什么PHP对象接受仅在调用时提及的成员?
我对下面的代码片段感到矛盾,我不知道该怎么称呼它 我定义了一个非常简单的类,它还没有变量。现在,在构造函数中,我接受一个键和值数组,并使用foreach循环动态分配变量,如下所示:为什么PHP对象接受仅在调用时提及的成员?,php,oop,Php,Oop,我对下面的代码片段感到矛盾,我不知道该怎么称呼它 我定义了一个非常简单的类,它还没有变量。现在,在构造函数中,我接受一个键和值数组,并使用foreach循环动态分配变量,如下所示: class Food{ function Food($construct){ foreach($construct as $key=>$value){ $this->$key = $value; } } } 如果我现在使用如
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
这怎么可能呢?这在PHP中是可能的,并且是默认实现,除非您另有说明(通过uu get()和u set())。只能为当前实例动态创建公共成员,而不能为整个类创建公共成员。也可以从类内部或外部(例如通过实例)执行 将创建
公共smth
空的\u set()
魔术方法可以防止这种行为
public function __set($name, $value) { }
关于第二个问题:
这是不安全的,使用公共成员是不安全的(除非你有充分的理由公开你的属性)。公约规定,你必须拥有大多数私人/受保护的成员,并为他们提供访问器。因此,您可以从类内部而不是从它的实例获得类的控件。还有许多其他原因,包括代码的可重用性。这在PHP中是可能的,并且是默认实现,除非您另有说明(通过uu get()和u set())。只能为当前实例动态创建公共成员,而不能为整个类创建公共成员。也可以从类内部或外部(例如通过实例)执行 将创建
公共smth
空的\u set()
魔术方法可以防止这种行为
public function __set($name, $value) { }
关于第二个问题:
这是不安全的,使用公共成员是不安全的(除非你有充分的理由公开你的属性)。公约规定,你必须拥有大多数私人/受保护的成员,并为他们提供访问器。因此,您可以从类内部而不是从它的实例获得类的控件。还有许多其他原因,包括代码的可重用性。该变量不是未初始化的,只是未声明 在类定义中声明变量是可读性的一个风格点。此外,您还可以设置可访问性(私人或公共) 无论如何,显式声明变量与OOP无关,它是特定于编程语言的。在Java中不能这样做,因为变量必须显式声明
参考-
http://stackoverflow.com/questions/1086494/when-should-i-declare-variables-in-a-php-class
该变量不是未初始化的,只是未声明而已
在类定义中声明变量是可读性的一个风格点。此外,您还可以设置可访问性(私人或公共)
无论如何,显式声明变量与OOP无关,它是特定于编程语言的。在Java中不能这样做,因为变量必须显式声明
参考-
http://stackoverflow.com/questions/1086494/when-should-i-declare-variables-in-a-php-class
这很奇怪,但找不到任何关于为任何对象动态定义新属性的文档。@sectus me:p@sectus它是整个语言中动态变量定义的结果。它没有在OOP部分中被记录,因为它不一定与它相关,但是它在variables部分中被记录,在PHP中没有必要初始化变量,但是这是一个非常好的实践代码>对象和过程样式之间的细微区别在于,过程编程没有多个上下文。将值赋给一个页面中的变量,可以为整个页面定义变量。(不包括函数,但可以通过全局访问)@RoyalBg,所以$object->var不能作为简单变量处理。这很奇怪,但找不到任何关于为任何对象动态定义新属性的文档。@sectus me:p@sectus它是整个语言中动态变量定义的结果。它没有在OOP部分中被记录,因为它不一定与它相关,但是它在variables部分中被记录,在PHP中没有必要初始化变量,但是这是一个非常好的实践代码>对象和过程样式之间的细微区别在于,过程编程没有多个上下文。将值赋给一个页面中的变量,可以为整个页面定义变量。(不包括函数,但可以通过全局访问)@RoyalBg,所以$object->var不能作为简单变量处理。