- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
这可能是一个基本问题,但它让我想了很久。
我应该将所有私有(private)/局部变量声明为私有(private)吗?还是这只是“重要”变量所必需的?
例如,我有计算的(临时)结果。我应该预先声明这个变量吗?
希望有人能指出这一点。
最佳答案
既然你在谈论 private
、protected
和 public
我认为你在谈论属性,而不是变量。
在那种情况下:是,您应该事先声明它们。
由于 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/
问了这个问题How to reach CSS zen? ,我现在明白我遇到的问题大多与定位有关。我发现一些文章说 CSS 作为布局系统并不总是足够好。 http://echochamber.me/vi
我是一名优秀的程序员,十分优秀!