2013-07-15 3 views
2

Я играл с объектно-ориентированного программирования в PHP, и я получил следующий код:Доступ к свойствам объекта из другого класса

index.php:

<?php 
include('user.class.php'); 
include('page.class.php'); 

$user = new User; 
$page = new Page; 

$page->print_username(); 
?> 

user.class.php :

<?php 
class User { 

    public function __construct() { 

     $this->username = "Anna"; 
    } 
} 
?> 

page.class.php:

<?php 
class Page extends User { 

    public function __construct() { 
    } 

    public function print_username() { 

     echo $user->username; 
    } 
} 
?> 

Моя проблема возникает в классе «Страница» в функции print_username().

Как получить доступ к свойствам объекта $ user в этом классе? Я, как вы можете видеть, определяет два объекта в index.php.

Заранее спасибо

/C

+1

Pass '$ user' в качестве параметра –

+3

, если один класс будет распространяться другой стороны, нет никакого смысла инициации каждого класса – Ibu

ответ

7
class User { 
    public $username = null; 
    public function __construct() { 
     $this->username = "Anna"; 
    } 
} 

class Page extends User { 
    public function __construct() { 
     // if you define a function present in the parent also (even __construct()) 
     // forward call to the parent (unless you have a VALID reason not to) 
     parent::__construct(); 
    } 
    public function print_username() { 
     // use $this to access self and parent properties 
     // only parent's public and protected ones are accessible 
     echo $this->username; 
    } 
} 

$page = new Page; 
$page->print_username(); 

$user должен быть $this.

+2

Просто удалите' '__construct' из Страница', в этом нет необходимости ... – Neal

+0

не должен делать родительский :: __ construct(); внутри конструктора страницы? – steven

+0

@Neal ** Он учится. * Он должен знать, как переадресовывать вызовы, если он реализует методы, если у него нет причин не делать этого. – CodeAngry

2
class User { 
    public $username = null; 
    public function __construct() { 
     $this->username = "Anna"; 
    } 
} 

class Page extends User { 
    public function print_username() { 
     echo $this->username; //get my name! ($this === me) 
    } 
} 
1

Я вижу некоторую путаницу здесь:

  1. Вы вызвавшего ваши Page класс наследовать от User. Это означает, что сама страница обладает всеми свойствами класса User и фактически может использоваться вместо класса User. Поскольку метод print_username() написан в вашем коде, он не будет работать, потому что он не имеет ссылки на переменную $user. Вы можете изменить на номер $this, чтобы получить имя пользователя в методе print_username(), и заимствовать у родительского класса (User), чтобы получить свойство имени пользователя.
  2. Мое мышление заключается в том, что вы не намеревались это делать. Страница не является пользователем, в конце концов - они не связаны друг с другом. Поэтому вместо этого я должен удалить extends User из класса Page. Это сделает страницу Страница и пользователь Пользователь.
  3. Но как страница печатает имя пользователя? Страницы должны делать это, конечно. Вместо этого вы можете передать объект $ user в качестве параметра в Page__construct(), а затем вы можете ссылаться на это значение в своем Page.

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

Я хотел бы сделать это вместо того, чтобы:

<?php 
class User { 

    public function __construct() { 

     $this->username = "Anna"; 
    } 
} 

class Page { 

    private $user; 

    public function __construct($user) { 
     $this->user = $user; 
    } 

    public function print_username() { 

     echo $user->username; 
    } 
} 
$user = new User; 
$page = new Page($user); 

$page->print_username(); 

?> 
Смежные вопросы