事实上,PHP并没有强制所以的属性都要在类中声明。我们可以动态地添加属性到对象,如下所示:
class A {
public $id = "12345";
public $name = "aaa";
}
$a = new A();
$a->sex = "man";
print($a->sex);
但是,这种给对象赋属性的方法在面向对象编程中并不是一个良好的做法,我们基本上不用。至少,据我目前所知,C++、Java是不能直接这样添加的,可能会有一些其他的方法(用list、map)。
为什么说动态设置属性是一个坏习惯?因为你在创建类的时候就已经定义了数据类型,说明这个类(以及由类实例化的对象)是由特定的字段和函数集合组成。如果A
类定义了一个$name
属性,那么之后任何和a
对象一起工作的代码都假设$name
属性是可用的,但新增动态属性则没有这种保证。也就是说,你在实例化另一个对象aa
时,它并不具有$sex
这个属性,将会使程序报错。
$aa = new A();
print($aa->sex);
输出:
man
( ! ) Notice: Undefined property: A::$sex in ***
而且,还会有其他的不良影响,如拼错或忘记属性姓名时并不会的到警告。例如,错误的把这一行
$a->name = "aaa";
写作
$a->namee = "aaa";
因为PHP引擎认为这一行代码完全合法,所以不会发出警告。当我们开始输入名字时将会出现意想不到的效果。