命名空间和spl_autoload_register

时间:2015-12-04 16:21:52

标签: php namespaces

我发现了几个类似于我的SO问题,但我很难找到一个能帮助我的答案,而且我真的很想知道名称空间中存在的自动加载类的最佳实践。

我的文件夹结构:

root
-- classes
--- Users
---- Users.class.php

和users.php;

<?php
namespace CompanyName\ProjectName\Users;

class UserMapper
{
    // class code here
}

我的自动加载功能,位于根文件夹中;

/* autoload classes on instatiation */
spl_autoload_register(function($class)
{
    include $_SERVER['DOCUMENT_ROOT'] . '/classes/' . $class . '.class.php';
}); 

而且,假设我像这样调用用户类;

<?php
    new \CompanyName\ProjectName\User();

警告:include(/Applications/XAMPP/xamppfiles/htdocs/test_tool/classes/CompanyName\ProjectName\User.class.php):无法打开流:没有这样的文件或目录......等等

要使用spl_autoload_register,我是否需要将文件夹结构映射到我的命名空间结构?我不想这样做,因为我喜欢将我的课程放在同一个文件夹中,其中包含子文件夹。

或者我是否在自动加载功能中添加了额外的代码?

我也搜索了php手册,并且没有工作的命名空间示例,我觉得很奇怪。

非常感谢任何帮助。

提前致谢。

1 个答案:

答案 0 :(得分:0)

  

免责声明::我是php的初学者,我的回答可能不正确   但是我有信心检查和测试下面的示例可以帮助澄清像我这样的任何初学者对命名空间 spl_autoload_register 的使用。

考虑此文件夹结构:

  
      
  • root / 包含 index.php。
  •   
  • root / model / 包含 A.php和AA.php
  •   

A.php:

?php 

namespace company\model;

use \company\model\A;

class A 
{
	public function speak()
	{
		echo 'hello world! ';
	}
}

AA.php:

?php 

namespace company\model;

use \company\model\A;

require_once 'A.php';

class AA extends A 
{
	public function shout()
	{
		echo 'HELLO WOORLD!!!';
	}
}

index.php:

<?php 
    namespace company; 

    use \company\model\A;

    function classLoader ($className)
    {
        if (file_exists($className.'.php'))
        {
            require_once $className.'.php';
        } else {
            $className = str_replace('\\', '/', $className);
            $className = str_replace('company/', '', $className);
            if (file_exists($className.'.php'))
                require_once $className.'.php';
            else
                throw new EXCEPTION('classLoader could not find '.$className.'.php .');
      }
    }
    spl_autoload_register(classLoader);

    $obj = new A; 
    //we dont need to write ($obj = new \company\model\A;) 
    //because of statement at line 4
    $obj->speak();

    echo '<br/>';

    $objA = new \company\model\AA;  
    $objA->shout();

    echo '<br/>';

    class AB extends \company\model\AA  
    {
        public function doBoth()
        {
            $this->speak();
            $this->shout();
        }
    }

    $objB = new AB;
    $objB->doBoth();

相关问题