简体   繁体   English

inheritance 和组合中的自动加载和命名空间

[英]Autoload and namespace in the inheritance and composition

I wrote an Autoload:我写了一个自动加载:

<?php
function autoload($class)
{
    try
    {   
        global $path;
        $elements = explode("\\", $class); 
        $name_class = end($elements); 

        foreach ($elements as $element)
            {   
                if($element != $name_class)
                    {
                        $path .= $element."/"; 
                        echo "path:".$path."<br/>";
                    }
            }

        $file = strtolower(($path).$name_class.".php");  
        if(file_exists($file))
        {
              include($file);
              return;
        }
         throw new Exception($class." not founded");
    }
    catch(Exception $e)
    {
        echo $e->getMessage();
        return;
    }
}

class Autoloader
{
    public static function autoload($class)
    {
        autoload($class);
    }
}

spl_autoload_register('autoload');
spl_autoload_register(array('autoloader', 'autoload'));
?>

The Autoload finds a relative path and change it in an absolute path. Autoload 会找到一个相对路径并将其更改为绝对路径。

Now I have problem when I call a class from another file with different namespace.现在,当我从另一个具有不同命名空间的文件中调用 class 时,我遇到了问题。

For example if I have this file Base.php in the directorynamed framework:例如,如果我在名为 framework 的目录中有这个文件 Base.php:

namespace Framework;

use Framework\Inspector as Inspector;

 class Base
    {
        private $_inspector;

        public function __construct($options = array())
        {
            $this->_inspector = new Inspector($this);
...

Now I have the file Inspector.php in the same directory with the same namespace:现在我在具有相同命名空间的同一目录中拥有文件 Inspector.php:

<?php
namespace Framework;

    use Framework\ArrayMethods as ArrayMethods;
    use Framework\StringMethods as StringMethods;
    use \Exception as Exception;

    class Inspector
    {
...
?>

When I try to instantiate the class Base, I get the exception message about missing Inspector class.当我尝试实例化 class Base 时,我收到有关缺少 Inspector class 的异常消息。

The same think if I try to extend Base class in other directories.如果我尝试在其他目录中扩展 Base class 也是一样的想法。 I tried to add some echoes in my autoload function and it printed that he use local namespace of the child class or a class who uses an instance by composition of another class to create the string for finding the php file. I tried to add some echoes in my autoload function and it printed that he use local namespace of the child class or a class who uses an instance by composition of another class to create the string for finding the php file.

For example when I try the load Inspector in Base with echo I got:例如,当我尝试使用 echo 在 Base 中加载 Inspector 时,我得到:

path:Framework/
file:::C:\LightTPD\htdocs\mvc\framework\framework\Base.php (I add some ::: to make more readable)
framework/base.php


path:Framework/Framework/
file:::
framework/framework/inspector.php (trying to use the namespace of inspector after using the one of Base)


Framework\Inspector not foundedpath:Framework/Framework/Framework/
file:::
framework/framework/framework/inspector.php

Framework\Inspector not founded

When I tried to extend class Base by class Driver I got this:当我尝试通过 class 驱动程序扩展 class 基础时,我得到了这个:

path:Framework/
path:Framework/Configuration/
file:::C:\LightTPD\htdocs\mvc\framework\framework\configuration\Driver.php
framework/configuration/driver.php (everything ok)


path:Framework/Configuration/Framework/ (Framework is from Base; Configuration/Framework is from driver)
file:::
framework/configuration/framework/base.php 


Framework\Base not foundedpath:Framework/Configuration/Framework/Framework/
file:::
framework/configuration/framework/framework/base.php


Framework\Base not founded

-############################################################### The directory tree is: -################################################ ############## 目录树为:

It's:它的:

-framework: ArrayMethods.php, Base.php,Configuration.php, Inspector.php, StingMethods.php
           -configuration: Driver.php
                -exception
           -core
                -exception

How can I fix it?我该如何解决?

Sorry I noticed that the problem was the global $path. 抱歉,我注意到问题是全局$ path。

Now I wrote the autoload.php in this way: 现在,我以这种方式编写了autoload.php:

<?php
function autoload($class)
{
    try
    {   $path = NULL;
        $elements = explode("\\", $class); 
        $name_class = end($elements); 

        foreach ($elements as $element)
            {   
                if($element != $name_class)
                    {
                        $path .= $element."/"; 
                        $file = realpath(strtolower(($path).$name_class.".php"));  //realpath is optional 
                        if(file_exists($file))
                                {
                                      include($file);                       
                                      //echo $file."<br><br>"; testing in for debugging
                                      return;
                                }
                    }
            }   
       throw new Exception($class." not founded");
    }
    catch(Exception $e)
    {
        echo $e->getMessage();
        return;
    }
}

class Autoloader
{
    public static function autoload($class)
    {
        autoload($class);
    }
}

spl_autoload_register('autoload');
spl_autoload_register(array('autoloader', 'autoload'));
?>

Now even if it's less perfomant everything it's ok, he work whatever a class call another, it's based only the namespace of a class. 现在,即使没有什么问题,他也可以在一个类调用另一个类的情况下工作,它仅基于类的命名空间。

Make sure you include the files path of the class you want to extend(parent class) from to your child class file before the use namespaces of the parent/Base class.确保在父/基础 class 的使用命名空间之前包含要扩展(父类)到子 class 文件的 class 的文件路径。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM