Пространства имен php и автозагрузка - PullRequest
1 голос
/ 16 апреля 2011

Я прочитал несколько постов о пространствах имен и автозагрузке в php 5.3+, но все еще не смог создать одну работающую: x может, у некоторых из вас есть представление о том, что не так с моим кодом? Спасибо ранее.

Autoloader.php класс

<?php

    namespace my;

    class AutoLoader {

        private $aExt;
        private $sPath;
        protected static $instance;

        public static function getInstance() {
            if(!self::$instance instanceof self ) {
                self::$instance = new self();
            }
            return self::$instance;
        }

        function __construct($sPath = __DIR__, $exts = 'php') {
            // define path and extensions to include
            $this->setPath($sPath);
            $this->setExtensions($exts);
        }

        public function getPath() {
            return $this->sPath;
        }

        public function setPath($path){
            $this->sPath = $path;
        }

        public function removePath() {
            unset ($this->sPath);
        }

        public function addExtension($ext) {
            // prepends period to extension if none found
            $this->aExt[$ext]   = (substr($ext, 0, 1) !== '.') ? '.'.$ext : $ext;
        }

        public function removeExtension($ext) {
            unset ($this->aExt[$ext]);
        }

        public function getExtensions() {
            return $this->aExt;
        }

        public function setExtensions($extensions) {
            // convert
            if (is_string($extensions)) {
                $extensions = array($extensions);
            }

            // add
            foreach($extensions as $ext) {
                $this->addExtension($ext);
            }
        }

        public function register() {
            set_include_path($this->sPath);
            // comma-delimited list of valid source-file extensions
            spl_autoload_extensions(implode(',',$this->aExt));
            // default behavior without callback
            spl_autoload_register(array($this, 'autoload'));
        }


            public function autoload($sClassName) {
            include_once($sClassName.'.php');
            return;
        }

    }

    $autoloader = new AutoLoader();
    $autoloader->register();
?>

MyClass.php класс, который я пытаюсь загрузить динамически

<?php

    namespace my\tools;

    class MyClass {

        function __construct() {}

        function __destruct() {}

        function test() {
            echo 'ok';
        }
    }

?>

index.php звонящий

<?php

    include_once('../Libraries/php/my/AutoLoader.php');

    new my\tools\MyClass();
?>

и, наконец, структуры классов на моем диске

Libraries
  |_php
     |_my
     | |_Autoloader.php
     |
     |_MyClass.php

Ответы [ 3 ]

7 голосов
/ 16 апреля 2011

Это немного чрезмерно, мой друг.

Возможно, вы захотите взглянуть на простое использование PSR-0 (PRS-0 теперь устарело, PSR-4 - новое), спецификация автозагрузчика из большое количество PHP-проектов, таких как phpBB, Joomla, CakePHP, Zend Framework и многие другие . Он построен с учетом пространств имен, но хорошо работает с ними или без них.

Преимущество PSR-0 (или PSR-4) состоит в том, что он обеспечивает чистую, простую, очевидную структуру каталогов, которую поддерживает все большее число проектов. Это означает использование одного автозагрузчика вместо одного автозагрузчика для каждого отдельного набора кода.

1 голос
/ 18 апреля 2011

После небольшого поиска на сайте PHP.net решение было действительно простым: /

Фактически функция автозагрузки php ДОЛЖНА быть в корневом пространстве имен /, моя была на первом уровне моего пакета (my /), когда я переместил класс в корневое пространство имен, все работало нормально.

1 голос
/ 16 апреля 2011

spl_autoload_register() ожидает допустимого обратного вызова.Вы даете ... что-то ^^ Но не обратный вызов.Обратный вызов

// a closure
$cb = function ($classname) { /* load class */ }
// object method
$cb = array($object, 'methodName');
// static class method
$cb = array('className', 'methodName');
// function
$cb = 'functionName';

См. manual: spl_autoload_register () для получения дополнительной информации и примеров.

...