gpt4 book ai didi

php - 预先声明所有私有(private)/局部变量?

转载 作者:可可西里 更新时间:2023-10-31 23:08:44 26 4
gpt4 key购买 nike

这可能是一个基本问题,但它让我想了很久。

我应该将所有私有(private)/局部变量声明为私有(private)吗?还是这只是“重要”变量所必需的?

例如,我有计算的(临时)结果。我应该预先声明这个变量吗?

希望有人能指出这一点。

最佳答案

既然你在谈论 privateprotectedpublic 我认为你在谈论属性,而不是变量。
在那种情况下:,您应该事先声明它们。

由于 PHP 对象的设计方式,在编译时会创建一个数组 (properties_table)。该数组确保尽可能快地访问给定属性。但是,如果您在进行过程中添加属性,PHP 也需要跟踪它。因此,一个对象也有一个简单的属性表。
第一个 (properties_table) 是一个指针数组,而后者是一个简单的键 => 值表。
所以呢?好吧,因为 properties_table 只包含指针(固定大小),它们存储在一个简单的数组中,并且使用它们各自的偏移量获取指针。偏移量存储在另一个哈希表中,which is the ce->properties_info pointer .

正如 bwoebi 在评论中向我指出的那样:获取偏移量(HashTable 查找)是最坏情况下的线性操作 (O(n)),而预定义属性查找是恒定时间的复杂操作 (O(1))。另一方面,动态属性需要另一个 HashTable 查找,一个最坏情况的线性操作 (O(n))。这意味着,访问动态属性平均需要大约两倍的时间。维基百科的作者可以 explain Time-Complexity不过,比我好得多。

起初,访问修饰符可能看起来无关紧要。随着您的深入,您很快就会发现,有时您只是不想冒险让某些对象的某些属性被某些代码修改。那时您会看到 private 的值。
如果一个对象包含另一个对象,该对象包含您的代码将依赖的各种设置,例如,您可能会使用 getter 方法从外部访问这些设置,但您会将实际属性很好地隐藏起来使用 private

如果进一步向下,您要向您的项目添加数据模型和服务层,那么您将编写一个(抽象的)父类,如果只是为了类型提示,这是一个很好的改变。
如果这些服务实例包含类似于配置属性的内容,您可能会在父类中定义该 getter(只定义一次)。 private 意味着只有当前类可以访问一个属性,但是因为你不会有一个父类的实例来处理,而是一个 child ,你会明白为什么 protected 在处理更大的项目时也是无价的。

临时变量而言,无论是在方法、函数还是其他任何地方,您都不必预先声明它们,除非在某些情况下数组:

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[] = rand(); 语句时将其分配给 $return . PHP 会这样做,但是将您的 ini 设置为 E_STRICT | E_ALL 会在不提示的情况下表明它没有这样做。当传递0给方法时,数组不会被创建,PHP也会在到达return $return;语句时报错:undeclared variable。它不仅凌乱,还会减慢你的速度!您最好将 $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;
}

关于php - 预先声明所有私有(private)/局部变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17696289/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com