PHP5.x中的按引用传递
我正在学习Zend PHP5认证,一切看起来都不错,但我找不到传递或返回引用变量的真实示例PHP5.x中的按引用传递,php,pass-by-reference,return-by-reference,Php,Pass By Reference,Return By Reference,我正在学习Zend PHP5认证,一切看起来都不错,但我找不到传递或返回引用变量的真实示例 如果有人能举例说明何时使用它,那就太好了。假设您想编写一个函数,从数组中删除某些值 function remove_elements($array, $item1, $item2, ...) { ... } 您可以复制数组并返回它。但是如果你想知道是否有东西被移除了呢?而是就地修改数组并返回删除的元素数。因此: function remove_elements(&$array) { //
如果有人能举例说明何时使用它,那就太好了。假设您想编写一个函数,从数组中删除某些值
function remove_elements($array, $item1, $item2, ...) {
...
}
您可以复制数组并返回它。但是如果你想知道是否有东西被移除了呢?而是就地修改数组并返回删除的元素数。因此:
function remove_elements(&$array) {
// remove elements
return $number_removed;
}
如果您在函数中创建了一个复杂的结构,您可能希望返回对它的引用,而不是它的副本。但这是一个相当边缘化的案例,因为PHP使用写时复制(即在修改之前不会复制),但存在一些有效的用例
在编写类的成员函数时,通过引用返回更有意义。您可以返回对数据成员的引用,但这也会破坏封装
最后,值得注意的是,默认情况下,所有对象都是通过引用传递和返回的。其他所有内容都是通过值传递和返回的。通过引用传递:函数如
默认情况下,php5中的对象通过引用传递。(有关正确的说明,请参阅) 通过引用传递参数已得到回答 作为按引用返回值的(现实世界)示例,选择方法返回对与其自身调用上下文相同对象的引用的任意位置($this)。如果返回值是副本/克隆,则此操作将不起作用(如预期的那样) 例如 这会打印出
foo=1bar=2
,我想这是人们所期望的结果,这里没有什么意外。
如果该方法按值返回$this,它将不再工作。您可以通过强制php返回副本来测试这一点。此行使用
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();
。。。Sry。与Volkers相同:((Fluent界面就像我所知道的那样链接)
图像您有一个带有加载方法的流畅接口。加载接口替换或添加一些数据。在这里,通过引用值$success调用来确定加载是否成功可能很有用
通过引用返回:
以一些具有行列表的数据库对象为例。行数指向所有对象的右侧数据(平行)。如果返回nr.并将其传递给下一个对象,则可以跳过一个对象中的行,也可以跳过其他对象中的行。始终有一组有效的对象。对于一半的问题回答得很好,尽管这没有给出有关通过引用返回的信息。仍然没有:p function&foo():这是PHP手册资料:1.;2.:默认情况下,php5中的对象是通过引用传递的。“这是错误的。”对象"不是值,无法传递。
new MyClass
的计算结果为对象引用。对象引用可以通过值或引用传递,就像所有其他类型一样。对于所有类型的变量,&
参数通过引用传递,否则通过值传递。如上所述,参数中没有&
,因此s按值传递。如果需要,对象引用也可以按引用传递。newacct:pedantic在此上下文中,但同意,此处没有按引用传递。它是按值传递和返回的。谢谢。(addObject)它通过引用返回。默认情况下,它是一个对象。这是一个很好的示例,因为您可以在更改列表中的对象时更改返回的对象。否,您正在使用对象引用(在PHP5中,对象不是值),并按值返回它。此外,通过引用传递$someData
也是无用的,因为您没有更改它。
foo=1 bar=n/a
public function addObject(array &$someData){
$newObj = Fabric::create($someData);
$this->listOfObj[] = $newObj;
return $newObj;
}
....
$this->addObj(array('idontknow' => 'anything'))->setName('mr.knowitall')->save();