ложное срабатывание __autoload

A1x

Новичок
ложное срабатывание __autoload

напомнило соседней темой, но мне кажется это достойно отдельного внимания:

создадим файл A.php в котором объявим класс A
PHP:
<?php
class A {}
?>

сам скрипт:
PHP:
<?php
if (! class_exists('A')) {
    require_once('A.php');
}

function __autoload($classname) {
    echo 'autoload: ',$classname;
    require_once($classname.'.php');
}

class B extends A {

    function hello() {
        echo 'hello';
    }
}

$b = new B();

$b->hello();
?>
почему в этом случае срабатывает __autoload?
 

StUV

Rotaredom
зы:
приколись с кода:

PHP:
function __autoload($classname)
{
    echo 'in autoload';
}

if (!class_exists('qwer'))
{    
}
 

Beavis

Banned
A1x
когда ф-ция class_exists проверяет есть ли класс A - он подгружается автолоадом
 

Pigmeich

Новичок
ИМХО: если мы используем require_once то нам можно и не проверять что там загруженно, а что нет.
 

A1x

Новичок
Gas
да уже прочитал спасибо (извините)

-~{}~ 25.01.08 17:55:

Автор оригинала: Pigmeich
ИМХО: если мы используем require_once то нам можно и не проверять что там загруженно, а что нет.
у меня было так что один класс был описан в разных файлах (не спрашивайте почему)
и этот автолоад привел к фатальной ошибке - redeclare class
 

Gas

может по одной?
Извинятся не нужно, ты спросил, тебе ответили, ты понял, всё отлично :)
Ну а что касается
один класс был описан в разных файлах
имхо, это не правильно (если конечно не в разных namespace'ах)
 

A1x

Новичок
Автор оригинала: Gas
один класс был описан в разных файлах
имхо, это не правильно (если конечно не в разных namespace'ах)
Просто две библиотеки используют один и тот же базовый класс и каждая пытается плдключать его из своей директории
Да согласен конечно не очень красиво.

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

Интересно, когда в ПХП5 добавили этот второй параметр autoload в функцию class_exists - почему сделали его по умолчанию true, если это может приводить к каким-то неявным действиям
 

Beavis

Banned
A1x
в документацию смотреть надо когда новые функции используешь, тогда не будет ничего неявного
 

Gas

может по одной?
С другой стороны один и тот же класс в разных namespace - нарушение с точки зрения повторного использования кода.
Не один и то-же класс, а классы с одинаковыми именами.
Насчёт повторного использрвания вообще не понял.
 

Beavis

Banned
A1x
я имею ввиду "новые для себя"... если используешь функцию которую раньше в данной версии языка не использовал, идеально вообще сразу и в мануал посмотреть...
потому что совместимость между версиями пхп не полная
 

dimagolov

Новичок
A1x
а зачем class_exists вообще? require_once не решает проблемы глобально разве?
 

A1x

Новичок
dimagolov
потому что было два разных файла с одним классом. Ну это в общем не важно. Если немного подумать class_exists все делает правильно что дергает __autoload по умолчанию - вопрос можно закрывать
 

dimagolov

Новичок
ну а что мешает этот один класс положить в отдельный файл и вместо декларации класса через тот же require_once включить файл с классом в оба места?
 
Сверху