我的代码上面向PHP面向对象的问题

时间:2012-07-16 01:48:14

标签: php oop class inheritance extend

嗨,请看下面的代码。

<?php
class A
{
    public $name;

    public function getName()
    {
        return $this->name;
    }
}

class B extends A
{
    public function setName()
    {
        $this->name = 'Prasad';
    }
}

$obj = new B();

echo $obj->getName();

?>

当我回复这个名字时,它什么都没显示。与A类中的$ name相关。这个问题是getName还是setName?如何在扩展类B中设置A类中的$ name变量。如何从B类对象中获取该变量。欣赏我错过的任何暗示或解释。

5 个答案:

答案 0 :(得分:1)

您之前没有设置名称(使用$obj->setName())。

答案 1 :(得分:1)

你的代码大部分都在那里,事实上,如果你添加了一行代码来告诉代码调用setName()函数,你会有一个有用的例子:

$obj = new B();
$obj->setName();
echo $obj->getName();

更典型的是,您将使用带有参数的set函数,然后传递您要设置的值。您还可以将$name属性设置为protected,这意味着必须通过set&amp; amp;获取方法(手册中更多关于visibility):

<?php
class A
{
    protected $name;

    public function getName()
    {
        return $this->name;
    }
}

class B extends A
{
    public function setName($name)
    {
        $this->name = $name;
    }
}

$obj = new B();
$obj->setName('Prasad');
echo $obj->getName();

?>

答案 2 :(得分:1)

从技术上讲,它回显了$name变量(此时未定义)。不幸的是,它还没有确定。尝试使用$obj->setName()设置名称。

答案 3 :(得分:1)

是的,因为SomeKittens建议您首先需要调用setName()。

class A
{
    public $name;

    public function getName()
    {
        return $this->name;
    }
}

class B extends A
{
    public function setName()
    {
        $this->name = 'Prasad';
    }
}

$obj = new B();
$obj->setName();
echo $obj->getName();

但是,在B的构造函数中执行名称设置可能更好,因为:

class A
{
    public $name;

    public function getName()
    {
        return $this->name;
    }
}

class B extends A
{
    public function B()
    {
        $this->name = 'Prasad';
    }
}

$obj = new B();

echo $obj->getName();

我使用http://writecodeonline.com/php/来测试代码,打印Prasad

更好的是,在创建新的B对象时传递名称'Prasad',如下:

class A
{
    public $name;

    public function getName()
    {
        return $this->name;
    }
}

class B extends A
{
    public function B( $value = 'Prasad' )
    { 
        $this->name = $value;
    }
}

$obj = new B();

echo $obj->getName(), "<br>";

$obj = new B( 'John' );

echo $obj->getName();

答案 4 :(得分:0)

这是因为您没有先设置name属性。拨打B->setName(),然后拨打B->getName()即可获取姓名。