最近我正在學習Zend框架2,而且也討厭我很長一段時間的問題,事情是這樣的:Zend的framework2請問怎麼自動加載功能工作
<?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");
}
//....
?>
此代碼是A項「骨架應用程序「程序,這是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');
}
?>
上面的程序效果很好,當然我創建了一個名爲腳本和lib兩個文件夾,並有一個測試文件命名.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');
}
?>
返回的頁面我inforamtion如下: 致命錯誤:類 '腳本\ LIB \測試' 在電子商務未發現:\ WAMP \ WWW \第6行
我試圖測試\ test_29.php更改命名空間的名稱,如腳本\ lib,腳本\ lib \ test ... 但它沒用。
任何答案將不勝感激,謝謝。
現在,我會給你這個問題的詳細信息: 要了解的「命名空間」的使用和「使用」,我看了材料相比於php.net: http://php.net/manual/en/language.namespaces.importing.php 在這個頁面中,有是一段代碼如下所示:
Example #1 importing/aliasing with the use operator
<?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函數加載類文件, 這裏有些不對勁。 我不知道問題出在哪裏,或者任何機構試圖編寫一個實例來將「Example#1」付諸實踐?我會等待你的回答。
你可能想[瞭解PHP命名空間](http://www.youtube.com/watch?v=d1kDT8YFAhI) – Sam