使用命名空间找不到的类

时间:2013-09-18 14:13:30

标签: php namespaces

我有一个名为Alumno.class.php的类,位于Root \ Classes \ Abm \ Alumno.class.php中。 所以这个类标题是:

/**
 * Gestiona las operaciones ABM del tipo de usuario alumno.
 * La clase no realiza validaciones, eso será labor del controlador.
 * @package AdminManantiales
 * @subpackage Abm
 * @author Ramiro Martínez D'Elía
 */

namespace AdminManantiales\Classes\Abm;

class Alumno extends Usuario{ // Implement }

现在,我需要在php脚本中使用该类,并尝试使用:

use \AdminManantiales\Classes\Abm\Alumno as AbmAlumno;
[...]
// Proceso el alta.
$alumno = new AbmAlumno();
$alumno->alta($_POST);
$nombreCompleto = $alumno->toStr();

但它在$alumno = new AbmAlumno();行失败了。随着下一条消息:

  

类'AdminManantiales \ Classes \ Abm \ Alumno'未找到

如何使用“use”关键字正确包含该类?。

2 个答案:

答案 0 :(得分:5)

use关键字实际不执行任何操作。你必须手动包含PHP脚本,使用include \AdminManantiales\Classes\Abm\Alumno.php(或任何文件路径)或使用autoloading这样,

function autoload($classId)
{
    $classIdParts       = explode("\\", $classId);
    $classIdLength      = count($classIdParts);
    $className          = strtolower($classIdParts[$classIdLength - 1]);
    $namespace          = strtolower($classIdParts[0]);

    for ($i = 1; $i < $classIdLength - 1; $i++) {
        $namespace .= '/' . $classIdParts[$i];
    }

    if (file_exists(dirname(__FILE__)) 
        . '/' . $namespace 
        . '/' . $className 
        . '.class.php') {
        include $namespace . '/' . $className . '.class.php';
    }
}

spl_autoload_register('autoload');

然后,您可以存储此脚本,并将其包含在您使用use关键字的任何脚本中。

答案 1 :(得分:1)

您也可以使用自动加载功能(Appsrc/对您来说不同):

{
    "require": {

    },
    "autoload": {
        "psr-0": {
            "App": "src/"
        }
    }
}

您可能还必须在控制台中运行composer.phar dumpautoload