Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php zend framework2自动加载功能是如何工作的_Php_Namespaces_Zend Framework2_Autoloader - Fatal编程技术网

Php zend framework2自动加载功能是如何工作的

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

最近我在学习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 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';
    }
}