PHP: require_once и наследование - PullRequest
       8

PHP: require_once и наследование

2 голосов
/ 11 октября 2010

Если у меня есть:

<?php
require_once("bla.php");
class controller{.....}
php>

Если я затем создаю в другом файле class control_A extends controller{...}, нужно ли мне снова сказать require_once("bla.php");, или это наследуется?

Чтоесли require_once сделано в определении class controller?

Спасибо!

JDelage

Ответы [ 3 ]

6 голосов
/ 11 октября 2010

Пока у нас есть два противоречивых, но одинаково правильных ответа =) Давайте посмотрим, не могу ли я объединить два в более конкретный общий ответ.

Если любому классу требуется какой-либо код или определения в bla.php, то вам потребуется include("bla.php") хотя бы один раз за все время выполнения вашего скрипта. Если ваш предыдущий код:

<?php
require_once("bla.php");
class controller{.....}
php>

находится в файле controller.php, тогда вы можете создать control_A следующим образом:

<?php
require_once("controller.php");
class control_A extends controller{...}
?>

Это потому, что функция require_once() по существу копирует и вставляет содержимое файла в сценарий в этой строке. Поэтому вышесказанное будет рассматриваться как эквивалентное этому:

<?php
/* INSERTED FROM controller.php */
/* INSERTED FROM bla.php */
necessary definitions for controller
/* END bla.php */
class controller{.....}
/* END controller.php */
class control_A extends controller{...}
?>

Как видите, просто требуя controller.php, необходимые определения для контроллера теперь видны и анализируются. То, что вы можете не сделать, это опустить объявление controller. Это не только потому, что вам потребовалось bla.php при его объявлении, но также вы не можете расширить класс, который еще не был объявлен. Итак, следующий код:

<?php
class control_A extends controller{...}
?>

выдаст ошибку, поскольку контроллер не был определен.

Однако следует учитывать одну вещь - поскольку класс controller не расширяет какой-либо другой класс, он не должен иметь никаких внешних зависимостей. Есть хороший шанс, что все, что вы делаете в bla.php, которое должно быть выполнено до определения класса, либо не нужно, либо может быть реструктурировано. Что именно bla.php делает, что вам нужно, прежде чем определить controller?

2 голосов
/ 11 октября 2010

Пока вы включаете унаследованный класс, он не требует повторного запроса.

Т.е.

class1.php:

<?php
require_once("tools.php");
class class1 {

}
?>

class2.php:

<?php
require_once("class1.php");
class class2 extends class1 {

}
?>
0 голосов
/ 11 октября 2010

Да, вы делаете. require_once "foo.php" эффективно берет содержимое foo.php и вставляет его (а затем обрабатывает все его require с и include с).

...