Puoi spiegare il comportamento di PHP nei casi in cui una variabile di classe genitore è mascherata dalla variabile figlia con lo stesso nome? [chiuso]

1

Vedi il commento all'interno di ChildEntity ::__construct() :

class ChildEntity extends ParentEntity
{
    /** @var int */
    protected $classParameter;

    function __construct(int $classParameter)
    {
        /**
         * Question
         *
         * Below are the two ways of initializing the variable of ChildEntity
         *
         * Are they both initializing the same child(?) variable?
         * Are they initializing the parent(?) variable?
         * Can the child and parent have different values at the same time,
         * perhaps in different contexts?
         */
        $this->classParameter = $classParameter; // init local(?) variable?
        parent::__construct($classParameter); // init parent(?) variable?
    }
}

class ParentEntity
{
    /** @var int */
    protected $classParameter;

    function __construct(int $classParameter)
    {
        $this->classParameter = $classParameter;
    }
}

$childEntity = new ChildEntity(100);

Perché funziona qui sotto (codice leggermente diverso - parametro rimosso in parent e child usa solo genitore costruttore per inizializzare). Sembra che la classe genitore manipoli una variabile trovata nella classe figlia, senza che tale variabile sia presente in parent. È come se la variabile in ChildEntity e ParentEntity diventi una, e le istanze figlio e genitore fungano anche da istanza singola, a tutti gli effetti. È questo ciò che accade realmente dietro le quinte?

class ChildEntity extends ParentEntity
{
    /** @var int */
    protected $classParameter;

    function __construct(int $classParameter)
    {
        parent::__construct($classParameter); 
        print $this->classParameter;
    }
}

class ParentEntity
{
    function __construct(int $classParameter)
    {
        $this->classParameter = $classParameter;
    }
}

$childEntity = new ChildEntity(5);
    
posta Dennis 16.01.2018 - 19:31
fonte

1 risposta

4

Are they both initializing the same child(?) variable?

Quando l'oggetto viene creato, tutte le proprietà non private di tutte le classi genitore appartengono a questo oggetto appena creato. Non sa quali proprietà appartengono alla classe con cui è stata creata e quali appartengono a quella di un genitore.

Can the child and parent have different values at the same time, perhaps in different contexts?

Solo se crei due oggetti diversi, ad esempio (ho aggiunto un metodo getter):

$childEntity = new ChildEntity(5);
var_dump($childEntity->getClassParameter());

$parentEntity = new ParentEntity(6);
var_dump($parentEntity->getClassParameter());

Why does the below work?

Quando scrivi il seguente codice:

class ParentEntity
{
    function __construct(int $classParameter)
    {
        $this->classParameter = $classParameter;
    }
}

cioè, si inizializza una proprietà in un costruttore senza dichiararlo, php lo dichiara internamente internamente. E quando crei un ChildEntity , tutto avviene esattamente come ho già descritto. Dovrei ricordare che php assegna a questa proprietà non dichiarata una visibilità public - nonostante, per quanto pazza, contraddice Principio di sostituzione di Liskov . Dai un'occhiata:

class ChildEntity extends ParentEntity
{
    /** @var int */
    protected $classParameter;

    function __construct(int $classParameter)
    {
        parent::__construct($classParameter);
        var_dump($this->classParameter);
    }

    public function getClassParameter()
    {
        return $this->classParameter;
    }
}

class ParentEntity
{
    function __construct(int $classParameter)
    {
        $this->classParameter = $classParameter;
    }
}

$parentEntity = new ParentEntity(6);
var_dump($parentEntity->classParameter);

$childEntity = new ChildEntity(5);
var_dump($childEntity->classParameter); // oops, an error!
    
risposta data 16.01.2018 - 20:24
fonte

Leggi altre domande sui tag