PHP:不同类中具有相同名称的方法不起作用

时间:2013-06-17 17:30:24

标签: php class methods scope

不允许在不同的隔离类中使用相同的函数名? 我做错了什么?

我将实际代码减少到进行某些测试所需的最低限度。 这是:

<?php

error_reporting(E_ALL);
ini_set('display_errors', '1');

class confFunctions {

    function getConf() {

        function doWork() {
            echo "I am from confFunctions!<br />";
        }

        doWork();
    }

}

class thePage {

    function loadPage() {

        function doWork() {
            echo "I am from thePage!<br />";
        }

        doWork();
    }

}

// Start check.
echo "Checking...<br />";

$conf = new confFunctions();
$conf->getConf();

$page = new thePage();
$page->loadPage();

?>

输出结果为:

Checking...
I am from confFunctions!
Fatal error: Cannot redeclare doWork() (previously declared in /var/www/Test2/index.php:11) in /var/www/Test2/index.php on line 23

重命名其中一个共享名称函数可以使一切正常运行。也就是说,在第二个类中将doWork更改为doWork1,如下所示:

class thePage {

    function loadPage() {

        function doWork1() {
            echo "I am from thePage!<br />";
        }

        doWork1();
    }

}

给出了正确的结果:

Checking...
I am from confFunctions!
I am from thePage!

如果没有声明公开,那么类中的内容是否只对该类可见?

4 个答案:

答案 0 :(得分:3)

通过在函数中声明函数,您实际上是将第二个函数声明为全局范围。

如果您希望将函数限制在类范围内,请不要在另一个函数中声明函数,而是将它们声明为彼此。

考虑这个代码在另一个函数(在类中)声明一个函数:

<?php
class MyFunctions {
    function load() {
        function doWork() {
            echo "I am doing my work from global scope";
        }
    }
}

$mf = new MyFunctions();
$mf->load();
// $mf->doWork(); <-- won't work here

doWork(); // <-- this will work!
?>

现在考虑这个代码在另一个函数(在类中)声明一个函数。

<?php
class MyFunctions {
    function load() {
        //...
    }
    function doWork() {
        echo "I am doing my work from class scope";
    }
}

$mf = new MyFunctions();
// $mf->load(); <-- not really important anymore
$mf->doWork(); // <-- this will work now

// doWork(); <-- won't work here anymore
?>

答案 1 :(得分:1)

首先猜测的是,你不能从第一个例子中正确地关闭你的类。绝对允许不同的类具有相同的函数名称,因此这里的代码中还有其他内容未通过您发布的伪代码显示。

更新:

正如NL-X所说,通过在类函数中发布函数,然后在全局范围内创建它。感谢您使用实际示例更新伪代码。

答案 2 :(得分:1)

在声明命名函数时,函数作用域始终是名称空间。

您需要将其分配给变量以将其约束到特定范围($doWork = function() { })。

你似乎走了一条奇怪的道路。也许你应该使用私有方法?


完整示例只是为了说清楚:

class confFunctions {

    function getConf() {

        $doWork = function() {
            echo "I am from confFunctions!<br />";
        };

        $doWork();
    }

}

class thePage {

    function loadPage() {

        $doWork = function() {
            echo "I am from thePage!<br />";
        };

        $doWork();
    }

}

答案 3 :(得分:1)

我认为你不打算嵌套这些功能?并且你从全球范围内调用它们。

这样的事情很可能是你的意思

<?php

error_reporting(E_ALL);
ini_set('display_errors', '1');

class confFunctions {

    function getConf() {

        $this->doWork();
    }
    function doWork() {
        echo "I am from confFunctions!<br />";
    }

}

class thePage {

    function loadPage() {



        $this->doWork();
    }
    function doWork() {
        echo "I am from thePage!<br />";
    }

}

// Start check.
echo "Checking...<br />";

$conf = new confFunctions();
$conf->getConf();

$page = new thePage();
$page->loadPage();

?>