2011-09-18 2 views
3

Если у меня есть два класса, распространяющих 3-й класс, будет ли содержимое 3-го класса дважды создаваться при создании экземпляров как первого, так и второго классов?Вопрос о наследовании PHP относительно расширенных классов

Пример:

class class1 extends class3{} 

class class2 extends class3{} 

class 3{ 
    $this->db = new mysql(); 
} 

$class1 = new class1(); 

$class2 = new class2(); 

На приведенном выше объект будет дб быть созданы два раза, например? , в этом случае, в результате 2 подключения к mysql?

Спасибо,

ответ

1

первый,

class 3{ 
    $this->db = new mysql(); 
} 

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

+0

Да, пытался проиллюстрировать только, но Im знал о синтаксических ошибках. Спасибо за разъяснения. Таким образом, кажется, что не разумная идея иметь класс db в базовом классе, который будет расширен, если более одного класса расширят его в одном приложении. – Henrique

+0

@Henrique вы можете поместить объект в статическое свойство (только если это свойство в настоящее время равно null), что обеспечит единственный экземпляр класса db и только одну инициализацию. – dqhendricks

+0

Извините за немой вопрос, но как это будет? объявить 'protected static $ db'? Остальные останутся прежними? $ this-> db = new mysql(); ...? Спасибо, – Henrique

2

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

Если базовый класс открывает соединение с базой данных (но это требует, чтобы написать какой-нибудь нетривиальный код, как конструктор), то это будет происходить в любом производных, например:

class Base 
{ 
    private $db; // maybe "protected"... 
    public function __construct() { $db = new mysqli; /* + connect! */ } 
} 

class Der1 extends Base 
{ 
    public function __construct() { parent::__construct(); } 
} 

// etc. 
0

если новый MySQL() создает соединение, да

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