确定。我正在用PHP开始OOPS。创建了几个类:从父类继承的客户(父)和销售(子)类。创建了另一个testcustomer.php,其中创建了一个新的销售对象,但salesc()中定义的salesprint()函数不会回显客户的名称,尽管它在class.customer.php(parent)中设置为“Jane”。我的想法是,当销售类扩展客户类时,PHP自动包含从class.customer.php到sales.customer.php的所有代码,因此父类中的构造函数将$ name设置为“Jane”。
以下是代码: class.customer.php
<?php
class customer{
private $name;
private $cust_no;
public function __construct($customerid) {
$this->name = 'Jane';
$this->cust_no = $customerid;
}
}
?>
class.sales.php
<?php
require_once('class.customer.php');
class sales extends customer{
public function salesprint($customerid) {
echo "Hello $this->name this is a print of your purchased products";
}
}
?>
testcustomer.php 的
require_once('class.sales.php');
$objsales = new sales(17);
$objsales->salesprint(17);
?>
我得到的输出 您好,这是您购买的产品的打印件。
我做错了什么? 谢谢 罗梅什
答案 0 :(得分:2)
除了将Customer类扩展到Sale之外的事实是没有意义的,它没有显示任何内容,因为名称成员private
私有意味着在当前类之外不可用于他们的孩子,如果您想保护您的会员,但让他们可以使用您的扩展课程,则应使用protected
关键字。
顺便说一句,在字符串中使用变量时,您应该concatenate:
echo 'Hello ' . $this->name . ' this is a print of your purchased products';
或使用变量替换:
echo "Hello {$this->name} this is a print of your purchased products";
它更具可读性。
答案 1 :(得分:1)
因为$name
字段声明为private
,所以它不会继承到子类。将其更改为protected
。
另外,我建议您对$cust_no
字段执行相同的操作。通过这样做,您将避免将$customerid
作为参数传递给salesprint
方法,因此您的最终代码将如下所示:
$objsales = new sales(17);
$objsales->salesprint();
答案 2 :(得分:1)
最好能阅读http://Confuseoops.blogspot.com。很多例子
什么时候有人试图学习OOPS?他们会通过关键字和设计模式来混淆他们自己
答案 3 :(得分:0)
$ name是私有的,这就是为什么你无法从子类销售中访问它。将其更改为protected将使$ name对子类可见,或将其公开以使其对任何类都可见。
答案 4 :(得分:0)
2个问题。您的超类具有私有变量,因此只有该类可以访问这些变量。使用受保护或公开。此字符串也是错误的,只要$ this属性访问器有效。
echo "Hello ".$this->name. " this is a print of your purchased products";
答案 5 :(得分:-1)
好的,谢谢所有。从私人到保护的改变为我解决了......因为一些人抱怨程序设计不正确但这只是为了测试我对PHP中的继承如何工作以及PHP如何包含父的理解在运行时期间将类的代码转换为子类代码。无意考虑应用程序的设计......但仍然需要牢记未来......回到未来&gt;&gt;&gt;