如何在PHP中调用父类方法

7
这是可行的代码,但我想知道如何在不使用另一个对象(已注释的$foo)的情况下,使用class FooprintItem()方法来使用$bar对象。由于我是oop编程概念的新手,所以可能这个问题有点弱,但真的无法找到答案:(
我使用作用域解析运算符来使用Foo classprintItem(),现在我的疑问是,既然我们可以使用这种功能,那么创建对象的用途是什么?在合适的编码环境中何时使用作用域解析运算符。
<?php

class Foo
{
    public function printItem($string)
    {
        echo "This is in class Foo ". $string ."<br />";
    }

    public function printPHP()
    {
        echo "PHP is great "."<br />";
    }
}

class Bar extends Foo
{
    public function printItem($string)
    {
        echo "This is in class Bar ". $string ."<br />";
    }
}       

//$foo = new Foo;
$bar = new Bar;

$bar->printPHP();
$bar->printItem("Bar class object");
//Foo::printItem("Mental Case");
3个回答

16

printItem定义为静态方法,然后你可以使用Foo::printItem("Mental Case");调用它, 或者在子类方法中调用:

public function printItem($string)
{
    parent::printItem($string);
    echo "This is in class Bar ". $string ."<br />";
}

2
<?php
class test {

    public function __construct() {}

    public function name() {
       // $this->xname('John');
          $this->showName('John');
    }

    private function showName($name) {
        echo 'my name in test is '.$name;
    }
}

class extendTest extends test {

    public function __construct() {
        parent::__construct();
    }

    private function showName($name) {
        echo 'my name in extendTest is '.$name;
    }
}

$test = new extendTest();
$test->name();
?>

结果:我的测试名称是约翰

如果我们将showName方法的可见性更改为public或protected,则以上结果将为: 扩展测试中我的名称是约翰


2
xname()函数定义在哪里?为什么它会打印出“我的名字是测试约翰”? - I wrestled a bear once.
我猜回答者可能打错了字,已经纠正了。 - sqlchild

0
将printItem方法变为静态方法,只需添加“static”关键字。 这样,可以在不创建该类对象的情况下使用printItem($string)。
<?php

class Foo
{
    static public function printItem($string)
    {
        echo "This is in class Foo ". $string ."<br />";
    }

    public function printPHP()
    {
        echo "PHP is great "."<br />";
    }
}

class Bar extends Foo
{
    public function printItem($string)
    {
        echo "This is in class Bar ". $string ."<br />";
    }
}       

//$foo = new Foo;
$bar = new Bar;

$bar->printPHP();
$bar->printItem("Bar class object");
//Foo::printItem("Mental Case");

我运行了这段代码并发现错误 - 致命错误:无法在第22行中将静态方法Foo :: printItem()变为非静态方法在类Bar中。 - Niladri Banerjee - Uttarpara

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接