2011-04-15 104 views
1

我已经阅读了一些关于命名空间和自动加载在php 5.3+中的文章,但仍然没有成功创建一个工作:x也许你有些人有我的代码出了什么问题的想法? 以前谢谢。php命名空间和自动加载

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我试图要加载的类dinamically

<?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 
+0

对不起,我没有找到如何编辑我的文章,我想用自动装载机做什么,它只包括include_once('../ Libraries/php/my/AutoLoader.php');在我写的每一个脚本的开头,然后自动加载当然:p – kitensei 2011-04-15 20:35:41

回答

1

上PHP.net网站搜索过了一会儿,该解决方案是非常简单的:/

事实上PHP自动加载功能必须是根命名空间/,我的是我的包(我的/)的第一级,当我将该类移动到根名称空间时,一切正常。

7

这是一个稍微有点过度设计,我的朋友在阶级结构。

你可能想看看单纯用PSR-0(PRS-0现在贬值,PSR-4是新的),从大量的PHP项目的自动加载磁带机规格,像phpBB的是,Joomla,CakePHP的,Zend框架and lots more。它建立在命名空间的基础上,但是可以很好地运行或不运行它们。

PSR-0(或PSR-4)的优势在于它可以产生一个干净,简单,明显的目录结构,越来越多的项目正在支持这种结构。这意味着使用一个自动加载器,而不是每个单一代码集的一个自动加载器。

+0

我会看看它:)我通常使用更简单的自动加载器(我工作在PHP 5.2.n上),同时尝试不同的设置为个人项目,我发现这种使用自动装载机,似乎有趣:) – kitensei 2011-04-15 20:45:52

+0

查尔斯,我修复了一个断开的链接(PSR0),并添加了有关新的PSR4的信息,另一个链接也被打破(链接文本“和更多”),但不能找到替代品。 – James 2015-09-12 18:36:47

1

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()

+0

我知道如何回调工作:)但如果你没有指定一个有效的回调spl_autoload_register()方法,(从PHP文档)“自动加载功能正在注册如果没有提供参数,那么spl_autoload()的默认实现将被注册。“所以我也许误解了描述,但是如果回调被省略,php不会自动加载类? – kitensei 2011-04-15 20:43:19

+0

@ aoi-onore:”如果没有提供参数“,对,但是你提供了一个参数.PHP只会注册一个内建的然后:如果你想使用默认的参数,调用没有参数的'spl_autoload_register()'或'spl_autoload_register('spl_autoload')',但是你为什么要写自己的参数想要使用它吗?:? – KingCrunch 2011-04-15 20:45:05

+0

我更新了我的第一篇文章,但结果是一样的:( – kitensei 2011-04-15 20:47:50