gpt4 book ai didi

php - 获取 "Indirect modification of overloaded property has no effect"通知

转载 作者:IT王子 更新时间:2023-10-29 00:53:08 26 4
gpt4 key购买 nike

我想使用注册表来存储一些对象。这是一个简单的 Registry 类实现。

<?php
final class Registry
{
private $_registry;
private static $_instance;

private function __construct()
{
$this->_registry = array();
}

public function __get($key)
{
return
(isset($this->_registry[$key]) == true) ?
$this->_registry[$key] :
null;
}

public function __set($key, $value)
{
$this->_registry[$key] = $value;
}

public function __isset($key)
{
return isset($this->_registry[$key]);
}

public static function getInstance()
{
if (self::$_instance == null) self::$_instance = new self();
return self::$_instance;
}
}

?>

当我尝试访问此类时,我收到“对重载属性的间接修改无效”的通知。
Registry::getInstance()->foo   = array(1, 2, 3);   // Works
Registry::getInstance()->foo[] = 4; // Does not work

我做错了什么?

最佳答案

此行为已被多次报告为错误:

  • https://bugs.php.net/bug.php?id=42030
  • https://bugs.php.net/bug.php?id=41641

  • 我不清楚讨论的结果是什么,尽管它似乎与“按值”和“按引用”传递的值有关。我在 some similar code 中找到的解决方案做了这样的事情:
    function &__get( $index )
    {
    if( array_key_exists( $index, self::$_array ) )
    {
    return self::$_array[ $index ];
    }
    return;
    }

    function &__set( $index, $value )
    {
    if( !empty($index) )
    {
    if( is_object( $value ) || is_array( $value) )
    {
    self::$_array[ $index ] =& $value;
    }
    else
    {
    self::$_array[ $index ] =& $value;
    }
    }
    }

    注意他们如何使用 &__get&__set并且在分配值时使用 & $value .我认为这是使这项工作的方法。

    关于php - 获取 "Indirect modification of overloaded property has no effect"通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13421661/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com