既然你说的是private
, protected
and public
我认为你正在谈论特性,而不是变量。
在这种情况下:yes, you should事先声明它们。
由于 PHP 对象的设计方式,数组 (properties_table
) 在编译时创建。该数组确保尽可能快地访问给定属性。但是,如果您在进行过程中添加属性,PHP 也需要跟踪这一点。因此,一个对象有一个简单的properties
桌子也一样。
而第一个(properties_table
) 是一个指针数组,后者是一个简单的 key => value 表。
所以呢?嗯,因为properties_table
仅包含指针(具有固定大小),它们存储在一个简单的数组中,并且使用它们各自的偏移量来获取指针。偏移量存储在另一个哈希表中,哪一个是ce->properties_info pointer.
正如 bwoebi 在评论中向我指出的那样:获取偏移量(哈希表查找)是最坏情况的线性操作(O(n)),而预定义的属性查找是常数时间复杂操作(O(1))。另一方面,动态属性需要另一个哈希表查找,即最坏情况的线性操作 (O(n))。这意味着,访问动态属性平均需要大约两倍的时间。维基百科的作者可以explain 时间复杂度不过,比我能做的要好得多。
起初,访问修饰符可能看起来无关紧要。随着您的继续,您很快就会发现有时您只是不想冒险某些对象的某些属性被某些代码修改。这时候你就会看到它的价值private
.
例如,如果一个对象包含另一个对象,该对象保存您的代码将依赖的各种设置,您可能会使用 getter 方法从外部访问这些设置,但您会将该实际属性很好地隐藏起来使用private
.
如果,进一步,您要向项目中添加数据模型和服务层,那么您将编写一个(抽象)父类(如果仅用于类型提示),这是一个很好的更改。
如果这些服务实例包含类似配置属性的内容,您可能会在父类中定义该 getter(仅定义一次)。private
意思是only当前类可以访问属性,但由于您不会使用父级的实例,而是使用子级的实例,因此您会明白为什么protected
在处理大型项目时也非常有价值。
据,直到...为止临时变量所关心的,无论是方法、函数还是其他任何地方,你都不用担心have预先声明它们,但在某些情况下数组除外:
public function foo()
{
$temp = $this->getSomeValue();
return $temp ? $temp +1 : null;
}
完全有效,如果你写的话,效果不会更好
public function foo()
{
$temp;// or $temp = null;
$temp = $this->getSomeValue();
return $temp ? $temp +1 : null;
}
然而,类似这样的情况并不少见:
public function bar($length = 1)
{
for ($i=0;$i<$length;$i++)
{
$return[] = rand($i+1, $length*10);
}
return $return;
}
这段代码依赖于 PHP 足够友好地创建一个数组,并将其分配给$return
当。。。的时候$return[] = rand();
声明达成。 PHP 会这样做,但将你的 ini 设置为E_STRICT | E_ALL
会透露它不会这样做而不抱怨。经过时0
到该方法,数组将不会被创建,并且PHP在到达时也会抱怨return $return;
陈述:未声明的变量。它不仅混乱,而且还会减慢你的速度!你最好声明一下$return
作为范围顶部的数组:
public function bar($length = 1)
{
$return = array();//that's it
for ($i=0;$i<$length;$i++)
{
$return[] = rand($i+1, $length*10);
}
return $return;
}
为了安全起见,我还会检查参数类型:
/**
* construct an array with random values
* @param int $length = 1
* @return array
**/
public function bar($length = 1)
{
$length = (int) ((int) $length > 0 ? $length : 1);//make length > 0
$return = array();
for ($i=0;$i<$length;$i++)
{
$return[] = rand($i+1, $length*10);
}
return $return;
}