PHP class not storing reference

后端 未结 3 1420
[愿得一人]
[愿得一人] 2021-01-12 15:21

How do I pass a reference to an object constructor, and allow that object to update that reference?

class A{
    private $data;
    function __construct(&         


        
3条回答
  •  独厮守ぢ
    2021-01-12 15:45

    This would do what you are asking for:

    class Test {
    
        private $storage;
    
        public function __construct(array &$storage)
        {
            $this->storage = &$storage;
        }
    
        public function fn()
        {
            $this->storage[0] *= 10;
        }
    }
    
    $storage = [1];
    
    $a = new Test($storage);
    $b = new Test($storage);
    
    $a->fn();
    print_r($a); // $storage[0] is 10
    print_r($b); // $storage[0] is 10
    
    $b->fn();
    print_r($a); // $storage[0] is 100
    print_r($b); // $storage[0] is 100
    

    Alternative 1

    Instead of using an array, you can also use an ArrayObject, ArrayIterator or SplFixedArray. Since those are objects, they will be passed by reference. All of these implement ArrayAccess so you can access them via square brackets, e.g.

    $arrayObject = new ArrayObject;
    $arrayObject['foo'] = 'bar';
    echo $arrayObject['foo']; // prints 'bar'
    

    Alternative 2

    Instead of using a generic type, use a dedicated type. Find out what you are storing in that array. Is it a Config? A Registry? A UnitOfWork? Find out what it really is. Then make it an object and give it an API reflecting the responsibilities. Then inject that object and access it through that API.

    See this paper by Martin Fowler to some guidance on When To Make A Type

提交回复
热议问题