Attribuutreferentie werkt niet met inheritence

Ik zit vast met een gedrag van PHP dat ik niet begrijp.

class A {
    private $v;
    public function __construct(&$v)
    {
        $this->v = &$v;
    }

    public function setV($v) {
        $this->v = $v;
    }

    public function getV() {
        return $this->v;
    }
}

class B extends A {
    public function setV($v) {
        $this->v = $v;
    }
}

$v = '1';
$c = new A($v);//<= this will be replaced

echo $c->getV() . "\n";
$v = '2';
echo $c->getV() . "\n";
$c->setV('3');
echo $c->getV() . "\n";
echo $v . "\n";

uitgangen

1
2
3
3

But when I replace the object creation with $c = new B($v); it uitgangen

1
2
2
2

Ik zou dezelfde output verwachten als voorheen. Waarom is dit? Ik gebruik PHP 5.3 maar waarschijnlijk update om dit te proberen op te lossen.

0
Ah, natuurlijk! Bedankt voor de tip @koen. In elk geval zou dit naar mijn mening een foutmelding moeten geven.
toegevoegd de auteur str, de bron
Oh, eigenlijk geeft doet een foutmelding. Ik heb mijn configuratie verpest ...
toegevoegd de auteur str, de bron
Gebruik 'protected' in plaats van 'private'.
toegevoegd de auteur koen, de bron

2 antwoord

je gebruikt $ c = nieuw B ($ v) maar klasse B heeft geen constructor en daarom geef je de parameter $ v door. gebruik de constructor van de ouder en probeer:

class B extends A{
   public function __construct($v)
    {
       parent::_construct($v)
    }
}

probeer dan met je vervanger.

0
toegevoegd
B erft A 's constructor, dus dat is niet nodig. Koen heeft al op mijn probleem gewezen.
toegevoegd de auteur str, de bron

Wanneer een klasse een andere bovenliggende klasse uitbreidt, kan deze alleen openbare en beschermde variabelen en functies uit de bovenliggende klasse gebruiken .. Dus dit zal hetzelfde resultaat afdrukken;

<?php

class A {
 private $v;
  public function __construct(&$v)
  {
    $this->v = &$v;
  }

  public function setV($v) {
    $this->v = $v;
  }

 public function getV() {
    return $this->v;
  }
}

class B extends A {
    public function setV($v) {
        parent::setV($v);
    }
}

$v = '1';
$c = new B($v);//<= this will be replaced

echo $c->getV() . "\n";
$v = '2';
echo $c->getV() . "\n";
$c->setV('3');
echo $c->getV() . "\n";
echo $v . "\n";

?>
0
toegevoegd