从子类调用函数

时间:2011-09-08 15:04:14

标签: php

我有一种感觉,我想做的事情是不可能的,因为我找不到任何东西。我有一些类从另一个类扩展。在要扩展的类的内部,我必须根据哪个类调用它来调用一些唯一的代码。

这是一个深入的项目,所以我创建了一个测试用例来解释我想要做的事情:

class parent {
    function traverseTable($table) {
        foreach($table->getElementsByTagName('tr') {
            $rowCnt++;
            $this->uniqueSearch($rowCnt);
        }
    }
}

class child1 extends parent {
    function search($input) {
        //parse input, get $table
        $this->traverseTable($table);
    }

    function uniqueSearch($rowCnt) {
         echo 'child1';
        //Do different things
    }
}

class child2 extends parent {
    function search($input) {
        //parse input, get $table
        $this->traverseTable($table);
    }

    function uniqueSearch($rowCnt) {
         echo 'child2';
        //Do different things
    }
}

基本上,我希望能够在Class Parent中的循环内调用uniqueSearch()函数;但上面的语法似乎不起作用。有人有什么想法吗?此时,uniqueSearch函数的实际大小从20-100行不等,但可能会变大。

2 个答案:

答案 0 :(得分:2)

因此,您希望以多态方式调用uniqueSearch

  1. Your first problem与此无关,parent是保留字:

      

    致命错误:不能使用'parent'作为类名,因为它在第2行保留

    修复此问题。

  2. Your next problem是一个简单的语法错误:

      

    解析错误:语法错误,第4行意外“{”

    修复此问题。

  3. 然后,you have the issue您的测试用例中没有$table,没有getElementsByTagName。此外foreach ($table->getElementsByTagName('tr'))无效PHP。

    修复此问题。

  4. Your testcase doesn't call any functions

    修复此问题。

  5. 结果:

    <?php
    class base {
        function traverseTable($table) {
            foreach ($table as $element) {
                $rowCnt++;
                $this->uniqueSearch($rowCnt);
            }
        }
    }
    
    class child1 extends base {
        function search($input) {
            //parse input, get $table
            // dummy for now:
            $table = Array(0,1,2,3);
            $this->traverseTable($table);
        }
    
        function uniqueSearch($rowCnt) {
             echo 'child1';
            //Do different things
        }
    }
    
    class child2 extends base {
        function search($input) {
            //parse input, get $table
            // dummy for now:
            $table = Array(0,1,2,3);
            $this->traverseTable($table);
        }
    
        function uniqueSearch($rowCnt) {
             echo 'child2';
            //Do different things
        }
    }
    
    $c1 = new child1;
    $c2 = new child2;
    
    $c1->search("");
    $c2->search("");
    ?>
    

    now it works just fine

      

    child1child1child1child1child2child2child2child2

    事实证明,这个问题与多态性无关;只是愚蠢的语法错误。

    感谢您的参与。

答案 1 :(得分:1)

在父类中声明uniqueSearch()作为抽象方法(这意味着该类也必须声明为抽象)。这意味着每个孩子必须自己实施uniqueSearch()方法,所以它肯定存在。

abstract class parent {
    function traverseTable($table) {
        foreach($table->getElementsByTagName('tr') {
            $rowCnt++;
            $this->uniqueSearch($rowCnt);
        }
    }

    abstract function uniqueSearch($rowCnt);
}