Частное свойство PHP, видимое за пределами объекта (в том же классе) - PullRequest
1 голос
/ 13 декабря 2011

В этом примере у меня есть абстрактный класс и два обычных класса.Абстрактный класс не должен использоваться один, поэтому его конструктор защищен.Некоторые функции определены в абстрактном классе.

Одной из этих функций является функция «клон», которая должна возвращать новый экземпляр текущего объекта.Эта функция делает копию текущего объекта.

Вот мой вопрос:
При попытке установить $ copy-> baz ([2] в clone ()), это работает, потому что я вкласс, который определил эту частную собственность.Однако это не имеет смысла для меня (по крайней мере, в этом примере), потому что $ copy - это еще один объект (того же класса) - возможно ли заставить PHP использовать магический установщик («Установка частного свойства»), когдаустановить частную собственность другого объекта (не класса)?

abstract class ac
{
    private $baz = "fakedefault";

    function __set($name, $value)
    {
        die("Setting private property!");
    }

    function clone()
    {
        $copy = clone $this; //make copy
        //Test:
        $this->baz = "newval"; //[1] Works as expected
        $copy->baz = "newval"; //[2] Does not die!
        return $copy; //return copy
    }
}

class c1 extends ac
{
    function foo()
    {
        print $this->baz;
    }
}

class c2 extends ac
{
    function foo()
    {
        print $this->baz;
    }
}

function dostuff()
{
    $o = new c1();
    $o->baz = "thiswontwork"; //Private -> doesn't work
}

Ответы [ 2 ]

1 голос
/ 13 декабря 2011

Вам нужно назвать свой метод __clone, а не clone.

[отредактировано для замены кода]

попробуйте это:

<?

header( 'content-type: text/plain' );
abstract class ac
{
    private $name = 'default-value';

    public function __set($name, $value)
    {
        throw new Exception( 'Undefined or private property.' . $name );
    }

    function __clone()
    {
        // this does work - $this->name is private but is accessible in this class
        $this->name = 'Isaac Newton';
    }
}

class c1 extends ac
{

    function __clone()
    {
        // this does not work - $this->name is private to ac and can't be modified here
        $this->name = 'Isaac Newton';
    }

    function echoName()
    {
        echo $this->name;
    }
}

function dostuff()
{
    $o = new c1();
    //$o->otherVariable = 'test'; // won't work - it's undefined
    $a = clone $o;
}

dostuff();
0 голосов
/ 13 декабря 2011
$this->__set("baz", "newval");
...