PHP Class在文件中找到Class文件但没有找到Class

Posted

技术标签:

【中文标题】PHP Class在文件中找到Class文件但没有找到Class【英文标题】:PHP Class finds Class file but not Class in the file 【发布时间】:2011-02-11 23:31:49 【问题描述】:

我在一个文件中定义了一个抽象超类,在另一个文件中定义了一个子类。我需要超类文件和堆栈跟踪报告来查找包含它。

但是,当它到达“扩展”行时,它会返回一个错误:Fatal error: Class 'htmlBuilder' not found in View/Markup/HTML/HTML4.01/HTML4_01Builder.php on line 7

我刚才使用了另一个使用工厂的类树。我刚刚在工厂和消费者之间添加了构建器层。工厂层在包含和依赖方面看起来几乎完全相同。

所以这让我觉得我一定做了一些愚蠢的事情,导致 HTMLBuilder.php 文件没有被正确包含或正确解释或类似的。

这是完整的堆栈跟踪(路径略有改变):

#   Time    Memory  Function    Location
1   0.0001  53904   main( )   ../index.php:0
2   0.0002  67600   require_once( 'View/Page.php' ) ../index.php:3
3   0.0003  75444   require_once( 'View/Sections/SectionFactory.php' )  ../Page.php:4
4   0.0003  81152   require_once( 'View/Sections/HTML/HTMLSectionFactory.php' ) ../SectionFactory.php:3
5   0.0004  92108   require_once( 'View/Sections/HTML/HTMLTitlebarSection.php' )    ../HTMLSectionFactory.php:5
6   0.0005  99716   require_once( 'View/Markup/HTML/HTMLBuilder.php' )  ../HTMLTitlebarSection.php:3
7   0.0005  103580  require_once( 'View/Markup/MarkupBuilder.php' ) ../HTMLBuilder.php:3
8   0.0006  124120  require_once( 'View/Markup/HTML/HTML4.01/HTML4_01Builder.php' ) ../MarkupBuilder.php:3

这是有问题的代码:

父类(View/Markup/HTML/HTMLBuilder.php):

<?php

require_once('View/Markup/MarkupBuilder.php');

abstract class HTMLBuilder extends MarkupBuilder 

    public abstract function getLink($text, $href);

    public abstract function getImage($src, $alt);

    public abstract function getDivision($id, array $classes=NULL, array $children=NULL);

    public abstract function getParagraph($text, array $classes=NULL, $id=NULL);



?>

子类,(视图/标记/HTML/HTML4.01/HTML4_01Builder.php):

<?php

require_once('HTML4_01Factory.php');
require_once('View/Markup/HTML/HTMLBuilder.php');


class HTML4_01Builder extends HTMLBuilder 
    private $factory;

    public function __construct() 
        $this->factory = new HTML4_01Factory(); 
    

    public function getLink($href, $text) 
        $link = $this->factory->getA();
        $link->addAttribute('href', $href);
        $link->addChild($this->factory->getText($text));
        return $link;   
    

    public function getImage($src, $alt) 
        $image = $this->factory->getImg();
        $image->addAttribute('src', $src);
        $image->addAttribute('alt', $alt);
        return $image;
    

    public function getDivision($id, array $classes=NULL, array $children=NULL) 
        $div = $this->factory->getDiv();
        $div->setID($id);
        if(!empty($classes)) 
            $div->addClasses($classes);
           
        if(!empty($children)) 
            $div->addChildren($children);   
        
        return $div;
    

    public function getParagraph($text, array $classes=NULL, $id=NULL) 
        $p = $this->factory->getP();
        $p->addChild($this->factory->getText($text));
        if(!empty($classes)) 
            $p->addClasses($classes);   
        
        if(!empty($id)) 
            $p->setID($id); 
        
        return $p;
    




?>

【问题讨论】:

include_path 的值是多少? include_path => .:/usr/share/php:/usr/share/pear => .:/usr/share/php:/usr/share/pear 【参考方案1】:

请注意,在跟踪中,HTMLBuilder.php 需要 MarkupBuilder.php 需要 HTML4_01Builder.php。你有一个包含循环。定义HTML4_01Builder 时,PHP 还没有完成对HTMLBuilder.php 的处理。特别是,它还没有到达abstract class HTMLBuilder 定义的开头。

定义祖先时不需要包含后代类。 PHP 使用类名的后期绑定,因此后代只需要在方法被调用时存在。

MarkupBuilder.php:

<?php
// unnecessary: 
//require_once('View/Markup/HTML/HTML4.01/HTML4_01Builder.php');

class MarkupBuilder 
    static public function getInstance(...) 
        ...
        return new HTML4_01Builder(...);

【讨论】:

是的,我注意到了。奇怪的是工厂树具有完全相同的包含周期。结构相同。它没有打嗝。 @Daniel:你的意思是在一个文件中定义了一个抽象工厂类,它直接或间接包含一个在定义基类之前定义抽象工厂类的后代的文件?我敢打赌这不完全一样。 完全一样。 MarkupFactory 有一个 get instance 函数,该函数将一个实例返回给 HTML4_01Factory()。 HTML4_01Factory 是 HTMLFactory 的后代,而 HTMLFactory 又是 MarkupFactory 的后代。相同的循环 - 它有效。当我编写该代码时,它确实勾选了一个警告标志,但我决定继续尝试。 枪之子......我在程序的其他地方有完全相同的依赖循环工作正常,在另一个地方也有一个非常相似的依赖循环。但是,删除所有依赖循环就是解决问题所需要的。 boggles 代码以神秘的方式工作。我不会质疑。我的代码现在更漂亮了 - 除了拥有 FactoryAndBuilderFactory ;)

以上是关于PHP Class在文件中找到Class文件但没有找到Class的主要内容,如果未能解决你的问题,请参考以下文章

mac版beyond compare 4 中对比class文件

使用 PHP 创建 PowerPoint 文件

php 文件引用路径的问题

我怎样才能使用Zend Rand Class

eclipse打开包怎么隐藏class文件的显示

怎么找到Eclipse中生成的.class文件