不允许在不同的隔离类中使用相同的函数名? 我做错了什么?
我将实际代码减少到进行某些测试所需的最低限度。 这是:
<?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!
如果没有声明公开,那么类中的内容是否只对该类可见?
答案 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();
?>