Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么PHP对象接受仅在调用时提及的成员?_Php_Oop - Fatal编程技术网

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

为什么PHP对象接受仅在调用时提及的成员?,php,oop,Php,Oop,我对下面的代码片段感到矛盾,我不知道该怎么称呼它 我定义了一个非常简单的类,它还没有变量。现在,在构造函数中,我接受一个键和值数组,并使用foreach循环动态分配变量,如下所示: class Food{ function Food($construct){ foreach($construct as $key=>$value){ $this->$key = $value; } } } 如果我现在使用如

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

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

这怎么可能呢?

这在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不能作为简单变量处理。