2009-08-01 3 views
1

Медведь со мной, потому что я новичок в oop! Можно ли присвоить результат функции атрибуту?
Это, вероятно, не имеет смысла, поэтому я думаю, что код может выглядеть так!Основная проблема класса php

Class b extends a 
{ 
    public $conn= $this->connect(); 

    public function operation() { ...} 

} 

connect() является функцией от класса А, который подключается к базе данных и возвращает $result в случае успеха.

ответ

9

Да, это возможно, но вы должны сделать это в методе, как в constructor:

Class b extends a { 
    public $conn; 
    public function __construct() { 
     $this->conn = $this->connect(); 
    } 
    public function operation() { /* ... */ } 
} 
+0

Пожалуйста см. мой ответ. Это опасно, если ваш класс не может быть получен или метод 'connect' не может быть переопределен. – 2009-08-01 13:17:12

0

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

0

Как правило, это плохая форма, так как вы не можете быть уверены в том, что будет вызываться реализация метода connect(). Это один из текущего класса или один из суперкласса? На самом деле, я был бы удивлен, если бы PHP даже допустил это.

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

Однако для описываемого сценария я не буду инициализировать переменную-член в объявлении или внутри конструктора. Вместо этого я передал бы $conn конструктору. Это основа инъекции зависимостей.

+0

PHP допускает такую ​​функциональность. Фактически, когда * B * переопределяет 'connect',' $ conn' будет возвратным значением метода * B * 'connect', а если нет, то это будет один из * A * 's' connect 'метод. – Gumbo

+0

С 2004 года я не работал с PHP, поэтому я стою исправленным. Тем не менее, я все же утверждаю, что это плохая форма для вызова неконкретного метода из конструктора, поскольку вы не можете гарантировать, что производный класс не сломает ваш конструктор и сделает ваш класс недействительным. Исходный автор, похоже, хочет использовать это как ярлык (используя наследование метода, чтобы избежать повторения кода), что плохо. Я бы рекомендовал, чтобы он передал соединение с конструктором (инъекция зависимостей) или инициализировал переменную в конструкторе без вызова метода неконфигурации. – 2009-08-01 13:53:35

0

я обычно делаю что-то вроде этого

$link = mysql_connect(.....,......,......); 

Class b extends a { 
    public $conn; 
    public function __construct($link) { 
     $this->conn = $link; 
    } 
    public function operation() { /* ... */ } 
} 
$a = new b($link); 

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

Еще один совет для интеграции баз данных ООП всегда есть DBable базового класса, чтобы сделать ваши основные сохранить() нагрузки() найти() подсчет() и т.д., гораздо быстрее работать с БДОМ сохраняющихся объектами

BaseDBClass 
    A 
     B 
     C 
     D 
    X 
     Y 
     Z 
Смежные вопросы