2010-04-24 22 views
5

Estoy perdido aquí. Definí una superclase abstracta en un archivo y una subclase en otro. He solicitado el archivo de superclases y los informes de seguimiento de pila para encontrar un incluirlo. Sin embargo, luego devuelve un error cuando llega a la línea 'extends': Fatal error: Class 'HTMLBuilder' not found in View/Markup/HTML/HTML4.01/HTML4_01Builder.php on line 7. Lo tuve trabajando con otro árbol de clases que usa fábricas hace un momento. Acabo de agregar la capa de constructor entre las fábricas y el consumidor. La capa de fábrica se veía casi exactamente igual en términos de inclusiones y dependencias. Eso me hace pensar que debo haber hecho algo tonto que hace que el archivo HTMLBuilder.php no se incluya correctamente o interprete correctamente o algo así.Verificación de tonterías: PHP Class encuentra el archivo de clase pero no Class en el archivo

Aquí está la traza completa (caminos ligeramente alterada):

# 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 

Aquí está el código en cuestión:

clase de Padres (Ver/Marcar/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); 

} 

?> 

clase hija, (Ver/Marcar/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; 
    } 

} 


?> 

Agradecería todas y cada una de las ideas. Estoy completamente perdido aquí en cuanto a lo que está pasando mal. Estoy seguro de que es algo estúpido que no puedo ver ...

+0

¿Cuál es el valor de 'include_path'? – outis

+0

include_path =>.:/Usr/share/php:/usr/share/pear =>.:/Usr/share/php:/usr/share/pear –

Respuesta

2

Tenga en cuenta que, en la traza, HTMLBuilder.php requiere MarkupBuilder.php requiere HTML4_01Builder.php. Tienes un ciclo de inclusión. Cuando se define HTML4_01Builder, PHP no ha terminado de procesar HTMLBuilder.php. En particular, no ha llegado al comienzo de la definición abstract class HTMLBuilder.

No es necesario incluir una clase descendiente al definir el antecesor. PHP utiliza la vinculación tardía de los nombres de clase, por lo que el descendiente solo debe existir para cuando se invocan los métodos.

MarkupBuilder.php:

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

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

Sí, lo noté. Lo extraño es que el árbol de fábrica tiene exactamente el mismo ciclo de inclusión. Idéntico en estructura. Funcionó sin problemas. –

+0

@Daniel: ¿quiere decir que hay una clase de fábrica abstracta definida en un archivo que incluye directa o indirectamente un archivo que define un descendiente de la clase abstracta de fábrica antes de que se defina la clase base? Apuesto a que no es exactamente lo mismo. – outis

+0

Exactamente lo mismo. MarkupFactory tiene una función get instance que devuelve una instancia a HTML4_01Factory(). HTML4_01Factory es un desciende de HTMLFactory que a su vez desciende de MarkupFactory. Mismo ciclo - funcionó. Cuando estaba escribiendo ese código, marcaba una bandera de advertencia, pero decidí seguir adelante e intentarlo de todos modos. –

Cuestiones relacionadas