函数不会覆盖多级扩展类

时间:2014-06-21 16:08:09

标签: php class oop extend extends

我已经没有用于解决问题的问题,而不是覆盖它们扩展的类中的函数。希望有人在这里有更多想法尝试。

我会尝试以尽可能通用的方式解释这个问题,同时尽量不留下可能很重要的细节......所以这就是它。

这是一个代表基本结构的例子:

//For functionality common to every area of site
// in A.class.php
abstract class A{
    $called_class='';
    function __construct(){
        $this->called_class=get_called_class();
    }
    function foo(){
        echo "Apple";
    }
    function bar(){
        $this->foo();
    }
}

//Some specialized functionality
// in B.class.php
class B extends A{
    function foo(){
        echo "Grapefruit";
    }
}

//Specialized functionality for another area of site.
//This area has several distinct but related sub-parts,
// so C1 is for functionality common to those sub-parts
// in C1.class.php
abstract class C1 extends A{
    function foo(){
        echo "Orange";
    }
}
//For specialized functionality unique to each sub-part
// in C2.class.php
class C2 extends C1{
    function someotherstuff(){
        echo "Pear";
    }
}

类A,B,C1和C2在单独的文件中(A.class.php,B.class.php等),我使用自动加载功能,它知道如何根据类名定位类文件

使用上面的例子,当我实例化'C2'并调用foo()时,我希望得到“Orange”,当我运行上面的例子时,这正是发生的事情。

//WHEN CLASSES ARE ALL CONTAINED IN SAME FILE:
$x = new C2();
$x->foo();  //Displays "Orange"
echo $x->called_class; //Displays "C2"

然而,实际上,$ x-> foo()的行为是显示“Apple”而不是“Orange”。 在实践中,B类的行为正如它应该的那样。只有“C”分支似乎有问题。

//WHEN CLASSES ARE INCLUDED FROM MULTIPLE SEPARATE FILES:
$x = new C2();
$x->foo();  //Displays "Apple"
echo $x->called_class; //Still displays "C2"

我试图通过将每个类的源代码的副本组合到一个文件中来重现该问题,但令人惊讶的是,它在单个文件中完全正常工作。

我的下一个想法是,由于某种原因我实例化了错误的类,所以我开始在类A的构造函数中调用“get_called_class()”并存储该值。但是,这总是返回我期望的值(“C2”,在本例的上下文中)。

有没有人有任何想法为什么C2类的实例会使用A类的foo()函数而不是C2扩展的类C1? (为什么它会返回“Apple”而不是“Orange”)

编辑:这是我的自动加载功能归结为相关位。我所做的所有测试都表明我使用的功能是加载正确的文件。

public static function autoload($className) {
     $fileName=sprintf('%s.class.php',$className);

     $filePathsToCheck=array();

     //Check For Local Version
     $filePathsToCheck[] = PATH_TO_FOLDER_DEDICATED_TO_THIS_SITE.'classes/');

     //Check for Shared version
     $filePathsToCheck[] = PATH_TO_FOLDER_COMMON_TO_MULTIPLE_SITES.'classes/';

     foreach($filePathsToCheck as $filePath){
         if(file_exists($filePath.$fileName)){
            include_once $filePath.$fileName;
            break;
         }
     }

}

0 个答案:

没有答案