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

Я получаю 2 файла php a.php

<?php
class A extends B {}
class B{}

php a.php
>>>нет ошибки

б.php

<?php
class A extends B {}
class B extends C {}
class C{}

php b.php
>>>> Fatal error: Class 'B' not found in b.php on line 2

Согласно [руководству php.net]:

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

так что, пожалуйста, объясните, почему a.php не получает «фатальной ошибки».


person Donald    schedule 27.08.2013    source источник
comment
он ведет себя как функция :(   -  person    schedule 27.08.2013
comment
@MarkBaker выдает ту же ошибку, что и OP.   -  person Konsole    schedule 27.08.2013


Ответы (1)


Согласно документу PHP Inheritence.

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

В этом примере нет зависимостей для классов B и D:

<?php
 //This will work
 class A extends B {} //searches for class B in current document
 class B {}

 class C extends D{}
 class D{}

Класс B зависит от класса C

<?php
 //This will not work
 class A extends B {} //searches for class B in current document but class B has dependencies
 class B extends C {}
 class C{}

Для include и require вы должны включить файл, прежде чем использовать объявленную функцию/класс в этом файле.

См. также автозагрузка.

person Konsole    schedule 27.08.2013
comment
я все еще озадачен двумя моментами: 1. почему сработала функция __autoload, хотя я не вызывал ее явно 2. если это вызвало __autoload для поиска класса в текущем файле, почему не работает b.php? или это не будет запускаться рекурсивно? огромное спасибо ;) - person Donald; 27.08.2013
comment
В этом случае функция автозагрузки не срабатывает. Вам нужно написать код для автозагрузки класса в php. Я не пробовал, но использование автозагрузки может решить эту проблему. Вот хороший учебник по использованию автозагрузки в php codeforest.net/autoload-your- классы-в-php - person Konsole; 27.08.2013
comment
я только что попробовал... автозагрузка здесь не срабатывает, и эта функция не решит проблему, потому что загрузка самого файла вызовет еще одну проблему с неопределением. - person Donald; 27.08.2013
comment
казалось, что ключ в том, почему двойные зависимости создают проблемы, а одинарные нет - person Donald; 27.08.2013