不允许在不同的隔离类中使用相同的函数名?我做错了什么?
我将我的实际代码减少到进行一些测试所需的最小值。
<?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!
如果没有声明为public,类内部的内容不应该只对该类可见吗?
通过在函数中声明一个函数,实际上是将第二个函数声明到全局作用域中。
如果你希望你的函数被限制在类范围内,不要在另一个函数中声明一个函数,而是在另一个函数下声明它们。
考虑在另一个函数(在一个类中)声明一个函数的代码:
<?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
?>
声明命名函数时,函数作用域总是命名空间范围。
你需要把它赋值给一个变量来约束它到一个特定的作用域($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();
}
}
我不认为你打算嵌套函数?从全局作用域调用它们
像这样的东西可能是你想要的
<?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();
?>
第一个猜测是,不知何故,您没有正确关闭第一个示例中的类。不同的类绝对允许有相同的函数名,所以在你的代码中有一些其他的东西没有通过你发布的伪代码显示出来。
更新:正如NL-X所说,通过在类函数内部发布函数,它然后在全局作用域中创建它。谢谢你用实际的例子更新你的伪代码