无法调试输出

时间:2013-08-08 13:31:37

标签: php oop design-patterns

今天我正在阅读设计模式,我试图制作一个包含接口的示例程序,两个实现该接口的类和一个主索引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

现在的问题是,我无法得到第二个输出,即我们卖苹果!我们卖芒果!正在显示。请让我知道原因

2 个答案:

答案 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的向后兼容性,您会遇到结果。