1

我正在学习 Zend PHP5 认证,一切看起来都不错,但我找不到传递或返回变量的真实示例。

如果有人有什么时候使用这个的例子,那就太好了?

4

4 回答 4

2

假设您要编写一个从数组中删除某些值的函数。

function remove_elements($array, $item1, $item2, ...) {
  ...
}

您可以复制数组并返回它。但是,如果您想知道是否删除了任何内容怎么办?相反,您可以就地修改数组并返回删除的元素数。所以:

function remove_elements(&$array) {
  // remove elements
  return $number_removed;
}

如果您在函数内创建复杂结构,您可能希望返回对它的引用而不是它的副本。但这是一个相当边缘的案例,因为 PHP 使用写时复制(即在修改之前不会复制),但有一些有效的用例。

在编写类的成员函数时,通过引用返回更有意义。您可以返回对数据成员的引用,但这也可能破坏封装。

最后,值得注意的是,默认情况下,所有对象都是通过引用传递和返回的。其他所有内容都按值传递和返回。

于 2009-10-19T09:20:15.273 回答
1

通过引用传递:asort()等函数

$array = array(3, 2, 1);
asort($array);
于 2009-10-19T09:21:01.373 回答
0

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

(而且我不会称该界面直观;-))

于 2009-10-19T09:58:22.517 回答
-1

如果您使用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。并将其传递给下一个对象,您可以跳过一个对象中的行,也可以跳过其他对象。总是有一堆有效的对象。

于 2012-12-02T02:28:15.563 回答