【问题标题】:PHP autoload namespacePHP 自动加载命名空间
【发布时间】:2013-11-25 09:16:04
【问题描述】:

我想自动加载我的类,只放置命名空间 + 文件名。

示例:

目录骨架:

\var\www
  |_ foo
  |  |_ A.php
  |  |_ B.php
  |  
  |_ index.php

A.php:

<?php

namespace foo\A;

class A {

   private $a;

   public function __construct($a) {
       $this->a = $a;
   }

}

B.php:

<?php

namespace foo\B;

use foo\A;

class B extends A {

    private $b;

    public function __construct($a, $b) {
        parent::__construct($a);
        $this->b = $b;
    }   

}

index.php:

<?php

use foo\B;

define('ROOT', __DIR__ . DIRECTORY_SEPARATOR);

$b = new B('s', 2);

function __autoload($classname) {
    $namespace = substr($classname, 0, strrpos($classname, '\\'));
    $namespace = str_replace('\\', DIRECTORY_SEPARATOR, $classname);
    $classPath = ROOT . str_replace('\\', '/', $namespace) . '.php';

    if(is_readable($classPath)) {
        require_once $classPath;
    }
}

问题是在A类和BI类中用类名声明了命名空间,我使用的时候打印了__autoload的变量并且是正确的,bur调用构造函数时,找不到类。

错误:

Fatal error: Class 'foo\A' not found in /var/www/foo/B.php on line 7

如果我只实例化A,不使用B,问题是一样的。

我需要这样做,因为我希望在B类中,如果你不放use语句,你不能使用A,这样做更严格。

如果您理解我的问题,我现在不明白我的解释,但无论如何感谢您的任何建议!

PD:对不起我的英语水平。

【问题讨论】:

  • 您的命名空间声明错误。如果您想归档您在该树中描绘的内容,则两个类都必须为 namespace foo - 命名空间声明中没有类名。
  • 我知道,但是我希望我放置的命名空间带有类名,更加严格,因为如果我不这样做,我可以使用同一个命名空间中的类而无需导入使用语句。
  • 按照你的做法,类名实际上是foo\A\A 和foo\B\B。所以类加载器正在寻找文件ROOT/A/A.php 和ROOT/B/B.php。它们存在吗?
  • 是的,就是这样,所以有什么方法可以只导入java之类的类,而不是完整的命名空间?
  • 你的意思是像use foo\B\B as B? ;)

标签: php namespaces autoload


【解决方案1】:

您的代码应该是类中的代码:

A.php

<?php

namespace foo;

class A {

   private $a;

   public function __construct($a) {
       $this->a = $a;
   }

}

B.php

<?php

namespace foo;

class B extends A {

    private $b;

    public function __construct($a, $b) {
        parent::__construct($a);
        $this->b = $b;
    }   

}

【讨论】:

  • 正是这个。只是名称空间声明错误,因此您的自动加载器找不到它正在寻找的文件。 (见我对这个问题的评论)
  • 我希望导入的命名空间像 java,你只导入类而不是包/命名空间。
猜你喜欢
  • 2014-04-13
  • 2011-08-06
  • 2015-07-15
  • 2012-05-21
  • 2011-04-08
  • 2013-10-24
  • 2014-11-02
相关资源
最近更新 更多