Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP继承-方法和属性_Php_Inheritance - Fatal编程技术网

PHP继承-方法和属性

PHP继承-方法和属性,php,inheritance,Php,Inheritance,我显然没有正确理解继承。我将让我的代码进行对话: abstract class Calc { private $x; private $y; public function AddNumbers() { echo $this->x. " + " .$this->y; } } class myCalc extends Calc { public function __construct ($x,$y) { $this->x = $x; $th

我显然没有正确理解继承。我将让我的代码进行对话:

abstract class Calc {
private $x;
private $y;
public function AddNumbers() {      
    echo $this->x. " + " .$this->y;
}
}

class myCalc extends Calc {
public function __construct ($x,$y) {
    $this->x = $x;
    $this->y = $y;
   }
}

$calc1 = new myCalc(3,4);
$calc1->AddNumbers();
echo 'done';
exit;
好的,那么这里发生了什么:我想要一个抽象类,它将定义两个属性(x和y)和一个抽象方法(不管数字的串联,方法的实现不在我的问题范围之内),它将访问这些属性

然后,一个具体的类扩展了这个抽象类。如您所见,我可以成功地访问属性并设置它们,但当我调用add numbers时,似乎属性未设置

发生了什么,为什么不起作用,我如何修复它? 我可以定义一个在具体类中添加数字的方法,但我希望在抽象类中有一个定义可以重用的方法


谢谢

关键字
private
定义只有
Calc
中的方法才能修改这些变量。如果希望
Calc
中的方法及其任何子类中的方法访问这些变量,请改用
protected
关键字


您可以访问
$this->x
,因为PHP允许您在对象上创建成员变量,而无需声明它。执行此操作时,生成的成员变量隐式声明为
public
,但它与
Calc
中定义的
private
变量无关,该变量不在
myCalc

的范围内
private
关键字定义只有
Calc
中的方法才能修改这些变量。如果希望
Calc
中的方法及其任何子类中的方法访问这些变量,请改用
protected
关键字


您可以访问
$this->x
,因为PHP允许您在对象上创建成员变量,而无需声明它。执行此操作时,生成的成员变量隐式声明为
public
,但它与
Calc
中定义的
private
变量无关,该变量不在
myCalc

的范围内。抽象类中的两个属性是private,这意味着它们在扩展这个类的任何类中都不存在和已知

因此,
MyCalc
不会写入这些属性,您无法在
AddNumbers
函数中读取它们。
MyCalc
构造函数实际上创建了新的公共属性


将属性设置为“protected”,它就会工作。

抽象类中的两个属性是私有的,这意味着它们在任何扩展此属性的类中都不存在且不为人所知

因此,
MyCalc
不会写入这些属性,您无法在
AddNumbers
函数中读取它们。
MyCalc
构造函数实际上创建了新的公共属性


将属性设置为“受保护”,它就会工作。

您的属性是私有的,设置为受保护的或公共的。您的属性是私有的,设置为受保护的或公共的。感谢您的快速响应!我会记下你的答案,但目前有7分钟的时间限制。为了更好地理解OOP中的方法/属性可见性,请进一步阅读@Sven的答案作为补充:我想我愿意承认,尽管Sven和我在同一时间说了几乎完全相同的话,他说得比我好。谢谢你的快速回复!我会记下你的答案,但目前有7分钟的时间限制。为了更好地理解OOP中的方法/属性可见性,请进一步阅读@Sven的答案作为补充:我想我愿意承认,尽管Sven和我在同一时间说了几乎完全相同的话,他说得比我好。谢谢你的回复。谢谢你的回复。