1

是第一次在项目中使用命名空间。我有 3 节课:

Contacto.class.php

/**
 * Gestiona las operaciones ABM de la informacion de contacto de un usuario 
 * cualquiera.
 * 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\Contacto;

class Contacto { // Implement ... }

Usuario.class.php

/**
 * Gestiona las operaciones ABM del tipo de usuario más abstracto.
 * 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\Usuario;

abstract class Usuario { // Implement ... }

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\Alumno;

class Alumno extends \AdminManantiales\Classes\Abm\Usuario{ // Implement ... }

类的路径是ROOT/classes/Abm。因此,当包括要工作的类时:

include($_SERVER['DOCUMENT_ROOT']."/classes/Abm/Contacto.class.php");
include($_SERVER['DOCUMENT_ROOT']."/classes/Abm/Usuario.class.php");
include($_SERVER['DOCUMENT_ROOT']."/classes/Abm/Alumno.class.php");

失败并显示下一条消息:Class 'AdminManantiales\Classes\Abm\Usuario' not found in <b>/media/Datos/www/AdminManantiales/classes/Abm/Alumno.class.php</b> on line <b>12</b>

有任何想法吗 ?。

4

3 回答 3

4

When defining namespace you shouldn't use class name in it.

Class with definition:

namespace AdminManantiales\Classes\Abm;

abstract class Usuario { // Implement ... }

will be accessible after using

use AdminManantiales\Classes\Abm\Usuario;

or

class Alumno extends \AdminManantiales\Classes\Abm\Usuario { // Implement ... }

To explain it better: namespace can be considered as bag and class will be item in that bag. To access selected item you have to provide name of the bag (AdminManantiales\Classes\Abm) and this item (Usuario) :)

于 2013-09-16T12:39:17.780 回答
3

您将每个类放在其自己的名称空间中,因为您将类名称包含在名称空间名称中。

不要这样做,而是为所有类执行此操作:

namespace AdminManantiales\Classes\Abm;

这也可以让您简化语法。现在这些类在同一个命名空间中,您不需要使用完全限定名称来引用它们,所以这将起作用:

class Alumno extends Usuario { ... }
于 2013-09-16T12:40:42.700 回答
1

切勿在命名空间声明中使用斜线和点。

wrong formats:

<?php

namespace first\second.w;

?>

<?php

namespace first/second;

?>

在这里查看php.net

于 2013-09-16T12:41:21.810 回答