Дочерний класс PHP, получающий доступ к Родительской переменной проблеме

Вы можете попробовать с рекурсивным CTE:

WITH rcte AS 
(
    SELECT 21 AS [Index]
    UNION ALL
    SELECT [Index] - 1
    FROM rcte
    WHERE [Index] > 1
)
SELECT REPLICATE('*', [Index])
FROM rcte
OPTION (MAXRECURSION 0);
12
задан 6 May 2009 в 20:21
поделиться

4 ответа

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

abstract class Username {
   protected $id;
   protected $username;

   public __construct($id) {
      $this->id = (int) $id; // Forces it to be a string
   }
}

class ContactInformation extends Username {
    protected $mobile;
    protected $email;
    protected $nextel_id;
    public __construct($id, $mobile, $email, $nextel_id) {
       parent::__construct($id)
       $this->mobile = $mobile;
       ....
    }
}

Теперь вместо непосредственного создания экземпляра имени пользователя (что сейчас невозможно) вы вместо этого создаете ContactInformation. Затем ContactInformation вызывает конструктор Username в собственном конструкторе.

12
ответ дан 2 December 2019 в 06:45
поделиться

Метод parent :: используется только для доступа к родительским методам, которые вы переопределили в своем подклассе, или статическим переменным, например:

class Base
{
    protected static $me;

    public function __construct ()
    {
        self::$me = 'the base';
    }

    public function who() {
        echo self::$me;
    }
}

class Child extends Base
{
    protected static $me;

    public function __construct ()
    {
        parent::__construct();
        self::$me = 'the child extends '.parent::$me;
    }

    // until PHP 5.3, will need to redeclare this
    public function who() {
        echo self::$me;
    }
}

$objA = new Base;
$objA->who(); // "the base"

$objB = new Child;
$objB->who(); // "the child extends the base"

Вероятно, вам нужен правильный подкласс. Не создавайте подкласс в конструкторе базового класса, который переворачивает все виды лучших практик ООП с ног на голову (слабая связь и т. Д.), А также создает бесконечный цикл. (new ContactInformation () вызывает конструктор Username, который создает новый ContactInformation (), который ...).

Если вам нужен подкласс, примерно так:

/**
 * Stores basic user information
 */
class User
{
    protected $id;
    protected $username;

    // You could make this protected if you only wanted
    // the subclasses to be instantiated
    public function __construct ( $id )
    {
        $this->id = (int)$id; // cast to INT, not string

        // probably find the username, right?
    }
}

/**
 * Access to a user's contact information
 */
class ContactInformation extends User
{
    protected $mobile;
    protected $email;
    protected $nextel;

    // We're overriding the constructor...
    public function __construct ( $id )
    {
        // ... so we need to call the parent's
        // constructor.
        parent::__construct($id);

        // fetch the additional contact information
    }
}

Или вы можете использовать делегат, но тогда методы ContactInformation не будет иметь прямого доступа к свойствам имени пользователя.

class Username
{
    protected $id;
    protected $contact_information;

    public function __construct($id)
    {
        $this->id = (int)$id;
        $this->contact_information = new ContactInformation($this->id);
    }
}

class ContactInformation // no inheritance here!
{
    protected $user_id;
    protected $mobile;

    public function __construct($id)
    {
        $this->user_id = (int)$id;
        // and so on
    }
}
8
ответ дан 2 December 2019 в 06:45
поделиться

Во-первых, когда вы создаете ContactInformation , он также содержит все непубличные свойства и методы Username . Вам не нужен отдельный экземпляр Username .

Class Username {
    protected $id;
    protected $username;

    protected __construct($id) {
        $this->id = (int) $id; // Forces it to be a string
    }
}

Class ContactInformation extends Username {
    protected $mobile;
    protected $email;
    protected $nextel_id;
    // Pretend that these are here because they're defined in my parent
    //protected $id;
    //protected $username;

    public __construct($id) {
        parent::__construct($id);
        echo $this->id; //Should echo 1
    }
}

Однако, поскольку все поля защищены, это не сработает:

$contact_information = new ContactInformation(1); // Works fine
echo $contact_information->id;
// Whoops, visibility error because id isn't public
2
ответ дан 2 December 2019 в 06:45
поделиться

Если я правильно вас понял, вы хотите получить доступ к свойствам объекта из объекта, содержащегося в этом объекте? Если это верно, вот как это делается:

class A {

  // These are the properties you want to access from the child object
  public $property_a;
  public $property_b;
  public $property_c;

  // This is the child object variable
  public $child_object;

  public function __construct( ) {

    // Pass 'this' into the child so that the child has a reference back to the parent
    $this->child_object = new B($this);
  }
}

class B {

  // Holds a reference to the parent object
  protected $parent_object;

  public function __construct( $object ) {

    // Remember the reference to the parent object
    $this->parent_object = $object;
  }

  // Just a Demonstration Method
  public print_parent_property_a()
  {
    // Reach into the referred parent object, and get it's property
    print $this->parent_object->property_a;
  }
}

Итак, если бы вы сделали:

$my_object = new A();
$my_object->property_a = 'test_value';
$my_object->child_object->print_parent_property_a();

Вы бы получили 'test_value'

Это немного отличается от вашего примера тем, что вам понадобятся свойства родительского класса быть общедоступным, чтобы ребенок мог получить к ним доступ.

Все это работает, потому что в PHP объекты всегда передаются по ссылке, если вы явно не клонируете их.

1
ответ дан 2 December 2019 в 06:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: