2012-05-25 4 views
0

Есть ли способ, которым я могу определить __autoload в классе, поэтому всякий раз, когда я обращаюсь к неопределенному классу, PHP будет запускать метод класса __autoload?реализовать __autoload в классе

<?php 
class Test { 
    public function __construct() { 
     echo 'Instantiating ', __CLASS__, "\n"; 
    } 

    public function __autoload($className) { 
     echo "Loading $className\n"; 
     require_once($className . '.php'); 
    } 

    public function test() { 
     $test = new AnotherClass(); 
    } 
} 

$bill = new Test(); 
$bill->test(); 

AnotherClass.php:

<?php 
class AnotherClass { 
    public function __construct() { 
     echo 'Instantiating ', __CLASS__, "\n"; 
    } 
} 

Выход:

Instantiating Test 
Loading AnotherClass 
Instantiating AnotherClass 

ответ

1

Нет, функция __autoload должна быть глобальной.

Однако SPL есть способ, чтобы зарегистрировать любой вызываемой в качестве функции автоматической загрузки: spl_autoload_register(). Не имеет смысла использовать метод класса, хотя, скорее всего, вы просто создадите экземпляр, зарегистрируете метод и никогда больше не будете использовать этот экземпляр.

+0

Чтобы сообщить PHP, где найти класс, который будет определяться '__autoload'? ;) – duskwuff

+0

Хорошо, это глобальная функция. Получить его сейчас – Bruce

1

Эта страница содержит информацию о том, как реализовать автозагрузку в классах (PHP Manual) spl_autoload_register

+0

Nice one; не думал о SPL. Тем не менее, до того, как PHP 5.3 SPL был необязательным и, возможно, недоступным - особенно на общем хостинге, у вас не обязательно есть последняя версия PHP. – ThiefMaster

+0

Правда. Но вы всегда можете встроить альтернативную альтернативу в свой код начальной загрузки. В нашем приложении мы проверяем, можем ли мы использовать функцию spl_autoload_register, и если мы сможем это сделать, если мы не сможем использовать функцию __autoload, а направить оба из них в один класс. – Ben

+0

@ThiefMaster В течение всего моего времени я еще не видел хостинг-провайдера, у которого был отключен SPL: для этого конкретного расширения ваш аргумент очень слабый. – salathe

0

Это работает !!!

class ClassAutoloader { 
    public function __construct() { 
     spl_autoload_register(array($this, 'loader')); 
    } 
    private function loader($className) { 
     echo 'Trying to load ', $className, ' via ', __METHOD__, "()\n"; 
     include $className . '.php'; 
    } 
} 
+0

До того, как PHP 5.3 SPL был необязательным и, возможно, недоступен, и, особенно, на общем хостинге, у вас не обязательно есть последняя версия PHP. Кроме того, код станет довольно неприятным (регистрируя множество одинаковых функций автозагрузки) при создании нескольких экземпляров вашего класса. – ThiefMaster

+0

ОК я вижу. возможно, я должен просто придерживаться require_once, тогда – Bruce

+0

Глобальная функция '__autoload' всегда работает. Вам просто нужно включить любой файл, содержащий эту функцию, чтобы он работал. – ThiefMaster

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