今天我正在阅读设计模式,我试图制作一个包含接口的示例程序,两个实现该接口的类和一个主索引class.let查看下面给出的代码。 首先是界面Iproduct
<?php
interface Iproduct
{
//Define the abstract method
public function apple();
public function mango();
}
实现接口的两个类
<?php
// Including the interface
include_once 'Iproduct.php';
class Apple implements Iproduct
{
public function apple()
{
echo ("We sell apples!");
}
public function mango()
{
echo ("We do not sell Mango!");
}
}
<?php
// Include the interface Iprodduct
include_once 'Iproduct.php';
class Mango implements Iproduct
{
public function apple()
{
echo ("We do not sell Apple");
}
public function mango()
{
echo ("We sell mango!");
}
}
现在是主要的课程
<?php
include_once ('apple.php');
include_once ('Mango.php');
class UserProduct
{
public function __construct()
{
$apple_class_obj=new Apple();
$mango_class_obj=new Mango();
//echo("<br/> the apple class object: ".$apple_class_obj);
}
}
//creating the object of the UserProduct
echo ("creating the object!<br/>");
$userproduct_obj=new UserProduct();
?>
执行代码时得到的输出是:
creating the object!
we sell apples!we sell mango
现在的问题是,我无法得到第二个输出,即我们卖苹果!我们卖芒果!正在显示。请让我知道原因
答案 0 :(得分:4)
在过去(PHP之前的版本5)中,在创建对象时调用与该类同名的方法(PHP旧式构造函数方法)。
由于PHP向后兼容该行为,因此您现在可以看到输出。
为了向后兼容,如果PHP 5找不到给定类的
__construct()
函数,并且该类没有从父类继承,它将搜索旧式构造函数,按类的名称。实际上,这意味着唯一具有兼容性问题的情况是该类是否有一个名为__construct()
的方法,该方法用于不同的语义。 [由我大胆]
来自:Constructors and Destructors in the PHP Manual
所以你所经历的不再是界面或对象本身的问题,而是你可能不知道的一些副作用(这很老)。
要解决这个问题,只需在两个类中实现__construct()
方法,以便不再调用旧式构造函数:
class Mango implements Iproduct
{
public function __construct() {}
...
每个类的空方法足以阻止它。
您可能对以下内容感兴趣:
答案 1 :(得分:0)
在php 4x中,一个与该类同名的方法被认为是构造函数。使用php 5x,构造函数显式命名为__construct
。
由于PHP的向后兼容性,您会遇到结果。