非常简单的问题,但不是要求学术解释我想尽可能保持实用性:PHP什么时候会创建我的巨大类的副本,我将其传递给函数,何时只需创建指针相关数据?如果它一直创建指针,那么指定&的用途是什么? (除了封闭,显然)?我想我对翻译的胆量知之甚少。
答案 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
重要提示。默认情况下,对象按引用传递。 他们不会被克隆。即使没有在函数参数中指定&
,修改传递的对象也会导致原始对象被修改。防止这种情况的唯一方法是在函数/方法中克隆对象。