Php zend framework2自动加载功能是如何工作的
最近我在学习zend framework 2,有一个问题困扰了我很长时间,事情是这样的:Php zend framework2自动加载功能是如何工作的,php,namespaces,zend-framework2,autoloader,Php,Namespaces,Zend Framework2,Autoloader,最近我在学习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 imp
<?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 framework也有一个自动加载功能,但当我注意到“skeleton application Program”中的代码时,一开始就有一个名称空间,所以我也将名称空间添加到我的程序中:
<?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\u 29.php中找不到类“script\lib\test”
我试图更改名称空间的名称,如script\lib、script\lib\test。。。
但这没用
任何答复都将不胜感激,谢谢
现在,我将向您介绍有关此问题的更多详细信息: 为了理解“namespace”和“use”的用法,我查阅了php.net上的资料: 在此页面中,有一段代码如下所示:
<?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");
}
//....
?>
示例#1使用use操作符导入/别名
现在让我们回顾一下我在上面写的程序:
<?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”?我会等待你的回答 来自
Zend\Loader\StandardAutoloader设计为符合PSR-0的自动加载器。它假定名称空间+类名与文件系统的映射为1:1,其中名称空间分隔符和下划线被转换为目录分隔符
阅读更多关于:
因此,如果使用名称空间,则发送到自动加载程序的类名看起来不像test
。它看起来像您的\u名称空间\test
。您的_名称空间是您在类中使用NAMESPACE-YOUR_名称空间定义的名称空间代码>
PSR-0是这样一个标准:名称空间应该反映文件系统。只需将反斜杠替换为正斜杠即可。或者,如果您使用的是ZF1中的伪名称空间,则使用.
和/
。(相册\模型\相册)
因此,输出发送到自动加载器的$className
,您将看到..我认为您误解了这里发生的事情
名称空间允许您或多或少地为类创建“目录”。因此,您可以创建\Foo类和\Test\Foo类(其中\表示应用程序的“根”)。
自动加载的工作方式是文件镜像名称空间。因此,foo.php将位于自动加载的根目录中,但您将为\test\foo创建/test/foo.php
use关键字有两种用途。一个是to,另一个是在PHP5.4或更高版本中,将Trait引入当前类
现在,回答你的问题。首先,让我们看看您的代码
<?php
namespace test;
use script\lib\test;
$o = new test();
echo $o->getWelcome();
这不是一门课。这是一个函数。对于本例,您需要一个完整的类
<?php
namespace script\lib;
class test {
public function getWelcome() {
return 'welcome';
}
}
您可能想这样做,但也有一些不清楚的地方,当然我知道在我的程序中不需要使用名称空间,我想做的是模拟ZF2,以了解为什么在ZF2中我们可以用这种方式编写代码(例如线程中的第一个程序),那么您能解释一下在ZF2中到底发生了什么吗,为什么在ZF2中使用名称空间和一起使用没有问题,但我的程序不起作用?或者你可以给我举个例子?非常感谢。如果您查看ZF2中的public/index.php,您会发现它没有使用名称空间。名称空间是一种面向对象的编程原则,正如@Machavity所说,它允许在逻辑上分离类。从本质上讲,PHP不是纯粹面向对象的。因此,与请求交互的第一件事(本例中为index.php)通常不是名称空间,因为它不是一个类,只是一个实例化autoloader&application对象的过程文件。
<?php
namespace script\lib;
class test {
public function getWelcome() {
return 'welcome';
}
}