2016-09-13 6 views
0

На основании ответа от this question Я бы ожидал, что мой код будет работать, но по какой-то причине это не так. У меня есть простой класс, который расширяет класс из моей библиотеки классов.PHP Автозагрузка расширенных классов

_custom.php

$custom = new MyClass(); 
class MyClass extends MyAbstractClass{ 

    public function __construct(){ 
     parent::__construct(); 
    } 

} 

К сожалению, я получаю эту фатальную ошибку:

Fatal error: Class 'MyClass' not found in ...

Но если я удалю extends MyAbstractClass то ошибка уходит. Похоже, что проблема заключается в том, что при попытке расширения класса он не пытается загрузить MyAbstactClass, что и приводит к тому, что MyClass не будет найден вообще.

Любые мысли или предложения по этому вопросу?

+0

Вы уверены, что ошибка исчезнет или кулер/сложнее отладить один показ? – bassxzero

+0

Также вам нужно показать код автозагрузки – bassxzero

+0

Когда я удаляю расширения, отличные от автозагрузок MyClass, как ожидалось ... – Xtremefaith

ответ

0

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

class MyClass extends MyAbstractClass{ 

    public function __construct(){ 
     parent::__construct(); #you are forcing a construct call, it is not required if the parent constructor has no args. 
    } 

} 

$custom = new MyClass(); 

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

Вы можете определить магическую функцию __autoload(), но предпочтительнее spl_autoload_register(), так как она более динамична и не является постоянной, как функция __autoload().

+0

Полагаю, мне было странно, что до использования 'spl_autoload_register()' помещал его в этом порядке, работал, и в этом текущем рефакторе я реализовал автозагрузку, и теперь на заказ повлияло. Сейчас он работает, но это все имеет значение. Спасибо за объяснение. – Xtremefaith

+0

Это сработало бы * ЕСЛИ * вы включили файл, содержащий имя класса. Лично я использую класс автозагрузки PS4, модифицировал его, чтобы сделать его более эффективным. Он включает класс по пространству имен, а также определяет, в какой папке он находится. Поэтому, если я использую \ lib \ db \ statement' из класса, он попытается загрузить «statement.php» из моего «webroot \ lib \ db» \ ". – Xorifelse

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