【问题标题】:Symbol in PHP I've never come across beforePHP中的符号我以前从未遇到过
【发布时间】:2009-12-07 10:26:36
【问题描述】:

我可能应该有,但我以前从未见过这个。在查看 Smarty 插件的文档时遇到了它。

$smarty =& new Smarty;

特别是 =& 符号。如果您在 Google 中输入它,它会被忽略,就像任何其他搜索引擎一样。这是干什么用的?

这个函数签名也是如此:

function connect(&$smarty, $reset = false)

为什么是 & 符号?

【问题讨论】:

  • 请注意,在第一个示例中,您只需要在 PHP4 中使用它即可。
  • 字词适用于 Google,例如“等于 & php”。

标签: php smarty


【解决方案1】:

实际上,这段代码是为了与 PHP 4 兼容而编写的。& 符号在 PHP 5 中是无用的(正如 Tim 所说 - 从 PHP 5 开始,所有对象都是通过引用传递的)。

在 PHP 4 中,所有变量都是按值传递的。 如果你想通过引用传递它,你必须声明一个引用赋值:

$ref_on_my_object =& new MyObject();

PHP 5 默认配置仍然接受此代码,但最好编写:

$ref_on_my_object = new MyObject(); // Reference assignment is implicit

对于您的第二个问题,问题“几乎”相同... 因为 PHP 允许您声明函数参数(resp. types),而您不能为返回值这样做。 一种被接受但“不太好”的做法是避免在函数声明中进行引用声明:

function foo($my_arg) {    
    // Some processing
}

并使用引用调用...

$my_var;
$result = foo( &$my_var );
// $my_var may have changed because you sent the reference to the function

理想的声明应该更像:

function foo( & $my_input_arg ) {    
    // Some processing
}

然后,调用会丢失与号:

$my_var;
$result = foo( $my_var );
// $my_var may have changed because you sent the reference to the function

【讨论】:

    【解决方案2】:
    【解决方案3】:

    &passes an argument by reference。通过这种方式,connect() 可以操作$smarty 对象,以便调用函数可以检索修改后的对象。

    同样,=& 通过引用设置变量。

    【讨论】:

      【解决方案4】:

      正如蒂姆所说,它是对变量的引用。但是,如果您使用的是最新版本的 PHP,那么所有类对象都通过引用传递。如果你传递数组或其他内置类型,你仍然需要这个。

      【讨论】:

        【解决方案5】:

        第一个例子是返回引用,第二个例子是传递引用。

        您可以在 PHP manual 中阅读所有相关信息

        【讨论】:

          【解决方案6】:

          & 是 PHP 的引用运算符。它用于返回对对象的引用。在本例中为“新 Smarty”。

          【讨论】:

            【解决方案7】:

            & 符号将分配对变量的引用,而不是对象的值。

            【讨论】:

              【解决方案8】:

              & 运算符的主要用途之一是传递内存地址。这通常是您想要更改变量但不返回时执行的操作。

              函数 test_array(&$arr) { $varr[] = "test2"; } $var = array('test'); test_array($var); print_r($var); 这应该输出 数组(测试,测试2);

              这样做的目的通常是当您需要将正在使用的实际副本[内存地址]传递给另一个函数/对象时。过去通常使用它来缓解内存不足和提高性能,这是 C / C++ 和其他一些低级语言的特性。

              【讨论】:

              • 实际上,我认为您没有传递内存地址...我认为,您正在处理对保存数据的 zval 的引用...
              • 我明白了。我只是试图暗示该语言将使用与 C/C++ 内部操作类似的引用。并不是说它实际上向用户公开了内存地址,因为这是用户不应该知道的受保护信息。
              猜你喜欢
              • 2014-10-09
              • 2022-11-26
              • 1970-01-01
              • 2015-08-20
              • 2013-10-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多