1

今天我正在阅读设计模式,我尝试制作一个示例程序,它由一个接口、两个实现该接口的类和一个主索引类组成。让我们看看下面给出的代码。首先是接口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

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

4

2 回答 2

4

过去(PHP 5 之前的版本),在创建对象时会调用与类同名的方法(PHP 旧式构造方法)。

因为 PHP 向后兼容该行为,您现在可以看到输出。

为了向后兼容,如果 PHP 5 找不到__construct()给定类的函数,并且该类没有从父类继承一个函数,它将按类的名称搜索旧式构造函数。实际上,这意味着唯一会出现兼容性问题的情况是,如果该类有一个名为的方法__construct(),该方法用于不同的语义。[我大胆]

来自:PHP手册中的构造函数和析构函数

因此,您遇到的不是界面或对象本身的问题,而是您可能没有意识到的一些副作用(这真的很老了)。

要解决这个问题,只需__construct()在两个类中实现一个方法,以便不再调用旧式构造函数:

class Mango implements Iproduct
{
    public function __construct() {}

    ...

每个类一个空方法就足以阻止它。


您可能对以下内容也感兴趣:

于 2013-08-08T13:34:35.613 回答
0

在 php 4x 中,与类同名的方法被视为构造函数。在 php 5x 中,构造函数被显式命名为__construct.

由于 PHP 的向后兼容性,您会体验到结果。

于 2013-08-08T13:37:09.687 回答