最近在学习zend framework 2,有个问题困扰了我很久,大致是这样的:
<?php
namespace Album\Model;
// Add these import statements
use Zend\InputFilter\InputFilter;
use Zend\InputFilter\InputFilterAwareInterface;
use Zend\InputFilter\InputFilterInterface;
class Album implements InputFilterAwareInterface
{
public $id;
public $artist;
public $title;
protected $inputFilter;
public function exchangeArray($data)
{
$this->id = (isset($data['id'])) ? $data['id'] : null;
$this->artist = (isset($data['artist'])) ? $data['artist'] : null;
$this->title = (isset($data['title'])) ? $data['title'] : null;
}
// Add content to these methods:
public function setInputFilter(InputFilterInterface $inputFilter)
{
throw new \Exception("Not used");
}
//....
?>
这段代码是“骨架应用程序”程序的一部分,是ZF2的教程。第一次看到程序,不明白“namespace”和“use”是什么意思,因为这两个关键字在php5.2中是不存在的(早期版本也一样),所以我去了查看手册并尝试理解它。我编写了一个程序来模拟实际发生的情况:
<?php
use script\lib\test;
$o = new test();
echo $o->getWelcome();
function __autoload( $className ) {
$classname = strtolower( $classname );
require_once( dirname( __FILE__ ) . '/' . $classname . '.php' );
}
?>
上面的程序运行良好,当然我创建了两个文件夹,名为script和lib,还有一个名为test.php的文件。似乎一切都清楚了,zend框架也有自动加载功能,但是当我注意到“骨架应用程序”中的代码时,一开始有一个命名空间,所以我也将命名空间添加到我的程序中:
<?php
namespace test;
use script\lib\test;
$o = new test();
echo $o->getWelcome();
function __autoload( $className ) {
$classname = strtolower( $classname );
require_once( dirname( __FILE__ ) . '/' . $classname . '.php' );
}
?>
该页面返回给我的信息如下: 致命错误:第 6 行的 E:\wamp\www\test\test_29.php 中未找到 Class 'script\lib\test'
我试图更改命名空间的名称,例如 script\lib、script\lib\test... 但它没有用。
任何答案将不胜感激,谢谢。
现在我将为您提供有关此问题的更多详细信息: 为了了解“命名空间”和“使用”的用法,我查看了 php.net 上的资料:http: //php.net/manual/en/language.namespaces。 importing.php 在这个页面中,有一段代码是这样的:
Example #1 使用 use 操作符导入/别名
<?php
namespace foo;
use My\Full\Classname as Another;
// this is the same as use My\Full\NSname as NSname
use My\Full\NSname;
// importing a global class
use ArrayObject;
$obj = new namespace\Another; // instantiates object of class foo\Another
$obj = new Another; // instantiates object of class My\Full\Classname
NSname\subns\func(); // calls function My\Full\NSname\subns\func
$a = new ArrayObject(array(1)); // instantiates object of class ArrayObject
// without the "use ArrayObject" we would instantiate an object of class
?>
现在让我们回顾一下我在上面编写的程序:
<?php
namespace test;
use script\lib\test;
$o = new test();
echo $o->getWelcome();
function __autoload( $className ) {
$classname = strtolower( $classname );
require_once( dirname( __FILE__ ) . '/' . $classname . '.php' );
}
?>
一样,我正在尝试模拟该实例,如果我们不使用自动加载功能:
<?php
namespace test;
use script\lib\test;
require_once 'script/lib/test.php';
$o = new test();
echo $o->getWelcome();
?>
它也很好用,但是当我使用 __autoload 函数加载类文件时,出现了问题。我不知道哪里出了问题,或者任何人试图编写一个实例来将“示例 #1”付诸实践?我会等待你的答复。