代码之家  ›  专栏  ›  技术社区  ›  Layke

PHP对象问题

  •  1
  • Layke  · 技术社区  · 14 年前

    不幸的是,我不能提供任何代码示例,但是我将尝试创建一个示例。 我的问题是关于PHP中的对象和内存分配。

    如果我有一个物体,让我们说:

    $object = new Class();
    

    然后我做一些类似的事情

    $object2 = $object;
    

    这到底在干什么?我知道有一个克隆函数,但这不是我要问的,我关心的是这是否创建了另一个相同的对象,或者它是否只是为$object分配了一个引用。

    我强烈理解这意味着它只是创建一个引用,但在某些情况下,我发现我创建了另一个$对象,我不明白为什么。

    4 回复  |  直到 12 年前
        1
  •  1
  •   Tyler Carter    14 年前

    如果你使用魔法方法 __invoke ,您可以调用类似于函数的对象,它将调用该magic方法。

    class Object{
        function __invoke(){ return "hi"; }
    }
    
    $object = new Object;
    $object2 = $object();
    echo $object2; // echos hi
    

    那意味着 $object2 等于该函数返回的值。

    基本上,您是在调用一个函数,但是使用一个变量作为它的名称。所以:

    function test(){ echo "hi"; }
    $function_name = "test";
    $function_name(); // echos hi.
    

    在本例中,您只是调用一个对象。

    因此,在提到你的问题时,这实际上根本不是“克隆”,除非 __invoke() 函数如下:

    function __invoke(){ return this }
    

    在这种情况下,它将是对同一类的引用。

        2
  •  1
  •   Andrew Moore    14 年前

    您正在创建同一对象的第二个引用。这是一个证明:

    <?php
    class TestClass {
        private $number;
    
        function __construct($num) { $this->number = $num; }
        function increment() { $this->number++; }
    
        function __toString() { return (string) $this->number; }
    }
    
    $original = new TestClass(10);
    
    echo "Testing =\n";
    echo "--------------------------------\n";
    echo '$equal = $original;' . "\n";
    $equal = $original;
    
    echo '$equal = ' . $equal . ";\n";
    
    echo '$original->increment();' . "\n";
    $original->increment();
    
    echo '$equal = ' . $equal . ";\n";
    
    echo "\n";
    echo "Testing clone\n";
    echo "--------------------------------\n";
    echo '$clone = clone $original;' . "\n";
    $clone = clone $original;
    
    echo '$clone = ' . $clone . ";\n";
    
    echo '$original->increment();' . "\n";
    $original->increment();
    
    echo '$clone = ' . $clone . ";\n";
    

    使用 clone 如果要创建实例的副本。

        3
  •  0
  •   Jon Benedicto    14 年前

    假设你的意思是

    $object2 = $object;
    

    而不是

    $object2 = $object(); 
    

    PHP将创建对原始对象的引用,而不会复制它。参见 http://www.php.net/manual/en/language.oop5.basic.php ,该节称为 对象分配。

        4
  •  0
  •   Mike Sherov    14 年前
    <?php
    
    class Object{
        public $value = 1;
    
        public function inc(){
            $this->value++;
        }
    }
    
    $object = new Object;
    $object2 = $object;
    
    $object->inc();
    
    echo $object2->value; // echos 2, proving it's by reference