我正在尝试将包含的文件封装在函数中。在封装功能之外,无法访问包含文件中的任何内容。
我发现,包含文件中的变量将仅限于封装功能的范围,但所包含文件中的函数将可全局访问。
的index.php:
function encapsulate_this() {
include 'some_file.php';
}
encapsulate_this();
echo say_hello();
echo $test_variable;
some_file.php:
$test_variable = "Hi!";
function say_hello() {
return "Hello!";
}
输出:
Hello!
在上面的示例中,echoing say_hello()将起作用,但$ test_variable不会。
如何成功封装所包含文件中的函数,使其无法全局访问?
答案 0 :(得分:1)
所有函数(和类)在PHP中都是全局的,对于那些东西,没有“范围”这样的概念。我只看到两个选项:
以某种方式命名您的函数和/或类,以便它们不会与其他全局事物冲突,命名空间在这里可以提供很多帮助。例如。如果您严格将PSR-4命名标准应用于所有文件和所有函数,那么函数是否全局公开并不重要,因为它们的名称不会发生冲突。
使用匿名函数,这是限定函数的唯一方法:
$say_hello = function () {
return 'Hello';
};
答案 1 :(得分:0)
你应该考虑匿名类(php7 +)。在课堂上,您可以拥有public
,protected
和private
成员。
public
个成员可以在课堂外访问。
protected
个成员。
private
成员只能在课堂内访问。
一个小例子:
some_file.php
$helloClass = new class('HelloWorld') {
public function say_hello_public(){
return "Hello!";
}
private function say_hello_private(){
return "Hello!";
}
};
的index.php
function encapsulate_this() {
include 'some_file.php';
echo $helloClass->say_hello_public(); //Works because it's a public method.
echo $helloClass->say_hello_private(); //Won't work because it's a private method.
}
encapsulate_this();
echo $helloClass->say_hello_public(); //Won't work outside scope