我正在学习 Zend PHP5 认证,一切看起来都不错,但我找不到传递或返回变量的真实示例。
如果有人有什么时候使用这个的例子,那就太好了?
我正在学习 Zend PHP5 认证,一切看起来都不错,但我找不到传递或返回变量的真实示例。
如果有人有什么时候使用这个的例子,那就太好了?
假设您要编写一个从数组中删除某些值的函数。
function remove_elements($array, $item1, $item2, ...) {
...
}
您可以复制数组并返回它。但是,如果您想知道是否删除了任何内容怎么办?相反,您可以就地修改数组并返回删除的元素数。所以:
function remove_elements(&$array) {
// remove elements
return $number_removed;
}
如果您在函数内创建复杂结构,您可能希望返回对它的引用而不是它的副本。但这是一个相当边缘的案例,因为 PHP 使用写时复制(即在修改之前不会复制),但有一些有效的用例。
在编写类的成员函数时,通过引用返回更有意义。您可以返回对数据成员的引用,但这也可能破坏封装。
最后,值得注意的是,默认情况下,所有对象都是通过引用传递和返回的。其他所有内容都按值传递和返回。
通过引用传递:asort()等函数
$array = array(3, 2, 1);
asort($array);
php5中的对象默认是通过引用传递的。(有关正确的描述,请参见http://docs.php.net/language.oop5.references)
通过引用传递参数已经得到回答......
作为通过引用返回值的(现实世界)示例,请选择任何流畅的接口,其中方法返回对与其自己的调用上下文($this)相同的对象的引用。如果返回值是副本/克隆,这将不起作用(如预期的那样)。
例如
class MyClass {
protected $foo = 'n/a';
protected $bar = 'n/a';
function foo($val) {
$this->foo = (int)$val;
return $this;
}
function bar($val) {
$this->bar = (int)$val;
return $this;
}
function __toString() {
return 'foo='.$this->foo.' bar='.$this->bar;
}
}
$o = new MyClass;
$o->foo(1)
->bar(2);
echo $o;
这会打印出来foo=1 bar=2
,我认为这是人们所期望的结果,这并不奇怪。如果该方法按值返回 $this,它将不再起作用。您可以通过强制 php 返回一个副本来测试它。而不是return $this
使用线条
return clone $this;
输出将是
foo=1 bar=n/a
(而且我不会称该界面直观;-))
如果您使用chainig,它可能很有用,例如:
public function addObject(array &$someData){
$newObj = Fabric::create($someData);
$this->listOfObj[] = $newObj;
return $newObj;
}
....
$this->addObj(array('idontknow' => 'anything'))->setName('mr.knowitall')->save();
...对不起。和 Volkers 一样 :((我知道,Fluent 界面是链式的)。
想象一下,你有一个带有加载方法的流利界面。Load-interface 替换或添加一些数据。在这里,通过引用值 $success 执行调用以确定加载是否成功可能很有用。
通过引用返回:获取一些具有行列表的数据库对象。编号。of rows 指向所有对象的右数据(parallesl)。如果您返回 nr。并将其传递给下一个对象,您可以跳过一个对象中的行,也可以跳过其他对象。总是有一堆有效的对象。