Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP对象问题_Php_Oop - Fatal编程技术网

PHP对象问题

PHP对象问题,php,oop,Php,Oop,不幸的是,我不能提供任何代码示例,但是我将尝试创建一个示例。 我的问题是关于PHP中的对象和内存分配 如果我有一个对象,让我们说: $object = new Class(); 然后我做一些类似的事情 $object2 = $object; 这到底在做什么?我知道有一个克隆函数,但这不是我要问的,我关心的是这是否创建了另一个相同的对象,或者它是否只是为$object分配了一个引用 我非常理解这意味着它只是创建了一个引用,但在我的某些情况下,我发现我创建了另一个$object,我不明白为什么。

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

如果我有一个对象,让我们说:

$object = new Class();
然后我做一些类似的事情

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


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

如果使用magic方法
\u 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.
在本例中,您只是调用一个对象

因此,关于您的问题,这实际上根本不是“克隆”,除非
\u invoke()
函数如下所示:

function __invoke(){ return this }
在这种情况下,它将是对同一类的引用。

假设您的意思是

$object2 = $object;
而不是

$object2 = $object(); 
PHP将创建对原始对象的引用,但不会复制它。看,这一节叫做
对象分配。

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

<?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";

对不起。我不明白相关性?您能解释一下吗。@Laykes,您的代码在赋值周围有一个括号,因此Chacha102假设您在问如何在PHP中使用调用处理程序。我更新了我的答案,以提供如何将其用于引用赋值。嗯,您没有准确地回答这个问题,即:
$object2=$object()
在做什么。事实上,你们都没有。而且,在我得到被接受的答案之前,我没有否决投票,因为我想确保他没有错误地键入
$object()
。但事实证明他没有。你们中没有一个人真的提到过这个问题。所以,我想说的是,你们的评论影射了我的策略性否决票,这是一种侮辱,是完全错误的。@Chacha102:我不一定是针对你们的。我没读到这个问题。有那么多关于克隆的话题和参考资料,很难错过
()
。我指的是第一张海报,但第一张海报回答了我过去遇到的另一个问题。谢谢
<?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