【问题标题】:Why is a method with the same name as the class being called automatically?为什么会自动调用与类同名的方法?
【发布时间】:2015-11-17 06:05:53
【问题描述】:

编辑:编辑标题以使其更有用。最初我不知道是使用共享词导致了问题。

这是非常基本但相当神秘的。

我有两个班级:

class Hello
{
        public function hello()
    {
        echo "Hello";
    }
}

class World
{
    public function world()
    {
        echo " World";
    }
}    

被调用

include_once 'classes/Hello.php';
include_once 'classes/world.php';

$hi= new Hello;    
$wd= new World;`

结果Hello World

我最初不小心将hello 用作类World 的方法的名称。 结果Hello 即没有World

问题 1

为什么这些方法会触发?我已经实例化了两个对象,但没有要求方法“触发”。我想我必须做类似的事情:

$hi->hello();

获取输出。

问题 2

我更加困惑的是,如果两个函数都被称为 hello,我只会得到 Hello。

确实

$hi= new Hello;
$wd= new World;

实例化两个完全独立的对象。那么方法的实际 NAME 是如何影响任何事情的呢?

我还有很长的路要走,但这真的让我很困惑。

【问题讨论】:

标签: php oop object


【解决方案1】:

当您创建此类的新实例时,这两个方法都会被调用,因为这些方法与类本身具有相同的名称,因此它们是此类的 constructor

你好
{
        公共函数 你好()
    {
        回声“你好”;
    }
}
世界
{
    公共函数世界()
    {
        回声“世界”;
    }
}

所以当你从两个类中获取一个实例时,两个构造函数都会被调用。


现在,当您将这两个方法重命名为 hello 时,只有一个方法被计为构造函数,而另一个是另一个类中的普通方法。这就是为什么您只看到 Hello 作为输出。


但不要使用类名作为构造函数! It will be deprecated in PHP 7. 使用__construct()

【讨论】:

  • 这是一个知识渊博的答案。我在挠头,以为他遗漏了一些代码,但这确实有道理。引用也很好。
  • 奇怪的是它甚至不区分大小写。
  • @Dagon 类名不区分大小写:$o = new sTdClAsS;,但您应该使用声明的名称(参见手册中的注释:php.net/manual/en/functions.user-defined.php
  • Rizier123 太棒了。我不是故意制作一个构造函数。我没有意识到那是我正在做的事情。 10/10 有帮助。谢谢。 @Dragon 我正在测试。
  • @axiac 如果你在谈论 PHP.net 我不确定我需要多少小时才能发现将方法命名为与 class=__constructor 相同。我从来没有在任何地方看到过。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-16
  • 2017-10-31
  • 2011-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多