3

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

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

<?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

4 回答 4

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
?>
于 2013-06-18T07:24:08.060 回答
1

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

更新:

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

于 2013-06-17T17:36:53.037 回答
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();
    }

}
于 2013-06-18T06:54:04.443 回答
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();

?>
于 2013-06-18T06:57:29.793 回答