那么如何通过php中的引用传递真的有效吗?

时间:2010-12-28 03:33:53

标签: php pointers reference pass-by-reference interpreter

非常简单的问题,但不是要求学术解释我想尽可能保持实用性:PHP什么时候会创建我的巨大类的副本,我将其传递给函数,何时只需创建指针相关数据?如果它一直创建指针,那么指定&的用途是什么? (除了封闭,显然)?我想我对翻译的胆量知之甚少。

4 个答案:

答案 0 :(得分:2)

在PHP 5中,所有对象都由其句柄传递。无论您是否通过引用,都与性能无关。 (事实上​​,通过引用传递被警告在手册中较慢。)您在函数内部处理的对象与函数外部指向的对象相同。

当您通过引用传递对象(句柄)时,您可以更改外部变量指向的内容。这几乎总是不必要的。

答案 1 :(得分:0)

&运算符表示通过引用传递的变量。

$x = 'Hello World';
echo($x);

function asdf(&$var){
  $var = 'Test';
}

asdf($x);
echo($x);

同样适用于赋值和几乎任何其他语句。如果它未通过引用传递或分配,则假设它是通过值传递或分配的。

答案 2 :(得分:0)

为什么要打扰&,即使你可以这样做。这就是我的方式:

假设我有一个类'Book',其中包含一些公共方法和属性,如title,author,year 然后简单地制作一个对象:

$book = new Book()
// then I can use all public methods and properties

$book->title;

$book->author;

$book->year;

如果我愿意那么我可以创建一个子类说

class Novel extends Books{

  function buildIt(Book $bk){

      $bk->title;

      // so on 

  }

}

在函数buildIt中,我有一个Book'参数'的类对象 我可以传递“Book”类的整个对象。

我希望这有帮助。

答案 3 :(得分:0)

您可以在PHP手册中找到通过引用传递变量的大量用法。其中一个最好的例子是preg_match

preg_match将返回输入字符串中匹配模式的出现次数。然后,它将填充(如果提供)包含匹配项的引用$matches数组。

它可以被视为一种返回多个值的方法,尽管你应该小心这一点。每个例子:

class Server {

    protected $_clientId = 0;

    protected $_clients = array();

    /**
     * Get a pending connection.
     *
     * @param &$connection_id int The connection identifier.
     * @return resource The socket resource.
     */
    public function getNextClient(&$connection_id) {
        $clientSocket = socket_accept($this->_server);     
        $connection_id = $this->_clientId++; 
        $this->_clients[$connection_id] = $clientSocket;
        return $clientSocket;
    }

}

$server = new Server;
$socket1 = $server->getNextClient($id);
echo $id; // 0
$socket2 = $server->getNextClient($id);
echo $id; // 1

重要提示。默认情况下,对象按引用传递。 他们不会被克隆。即使没有在函数参数中指定&,修改传递的对象也会导致原始对象被修改。防止这种情况的唯一方法是在函数/方法中克隆对象。