Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 包含具有可见性范围的文件_Php_Oop_Scope - Fatal编程技术网

Php 包含具有可见性范围的文件

Php 包含具有可见性范围的文件,php,oop,scope,Php,Oop,Scope,当我们在PHP中包含文件时,它们会以某种方式被缓存。所以,如果一个包含类定义,当我们尝试包含它两次时,我们会得到一个错误,说“不能重新声明类” 但是,如果将作用域设置为当前函数,是否可以调用include文件代码 例如,如果我们有两个文件: moo.php: <?php class Moo { function __construct() { echo "hello, world!" . PHP_EOL; } } ?> <?php function foo

当我们在PHP中包含文件时,它们会以某种方式被缓存。所以,如果一个包含类定义,当我们尝试包含它两次时,我们会得到一个错误,说“不能重新声明类”

但是,如果将作用域设置为当前函数,是否可以调用include文件代码

例如,如果我们有两个文件:

moo.php

<?php
class Moo
{
  function __construct()
  {
    echo "hello, world!" . PHP_EOL;
  }
}
?>
<?php
function foo()
{
  include("moo.php");
  new Moo();
}

foo();

new Moo(); // <-- here should be an error saying "could not find class Moo"

include("moo.php");

new Moo(); // <-- and here should not
?>

main.php

<?php
class Moo
{
  function __construct()
  {
    echo "hello, world!" . PHP_EOL;
  }
}
?>
<?php
function foo()
{
  include("moo.php");
  new Moo();
}

foo();

new Moo(); // <-- here should be an error saying "could not find class Moo"

include("moo.php");

new Moo(); // <-- and here should not
?>


据我所知,不是
eval(file_get_contents(“moo.php”),或名称空间都没有用最少的代码达到预期效果…

名称空间应该解决此问题->名称空间应该解决此问题->使用
require_once()
include_once()
。它们将使PHP记住包含了哪些文件,而不会在代码的其他地方再次包含它们。在第一个include/require之后,同一文件上的后续文件基本上将成为空操作。

使用
require\u once()
include\u once()
。它们将使PHP记住包含了哪些文件,而不会在代码的其他地方再次包含它们。在第一个include/require之后,同一文件上的后续文件基本上将变成null-op。

您应该尝试为您的类实现。这将有助于防止类似的情况。

您应该尝试为您的类实现。这将有助于防止类似情况的发生。

似乎猴子修补:


似乎猴子补丁:



oops,刚刚看到代码下面的最后一行:)你确定正确使用了名称空间吗?是的,我需要在一个函数中包含该文件,创建一个类(在包含的文件中描述)实例,并防止在不包含该文件的情况下进一步实例化。oops,刚刚看到代码下面的最后一行:)你确定正确使用了名称空间吗?是的,我需要在一个函数中包含该文件,创建一个类(在包含的文件中描述)实例,并防止在不包含该文件的情况下进一步实例化。不,我需要在代码中保留进一步实例化类的可能性(如果只包含正确的文件)。您可以执行
$var=new Class();
任意次数,您知道。正如我所说,如果只包含正确的文件,您可以执行
包含一次('myclass.php')
可以任意多次,因为在第一次之后,PHP将不再实际包含该文件。因此,无论您想在何处使用moo类,都要执行一次包含,然后问题就解决了。这就像C++一样:您只能在知道其定义的情况下实例化该类。当然,您应该使用名称空间,但在这种情况下,似乎需要某种类型的“几行的名称空间”…但该代码将在循环中运行,因此使用名称空间不是一个好主意…不,我需要保留在代码中进一步实例化类的可能性(如果只包含正确的文件)。您可以执行
$var=new class()
你想多少次就多少次,你知道。正如我说的,如果只包含正确的文件,你可以做一次
include_('myclass.php')
可以任意多次,因为在第一次之后,PHP将不再实际包含该文件。因此,无论您想在何处使用moo类,都要执行一次包含,然后问题就解决了。这就像C++一样:您只能在知道其定义的情况下实例化该类。当然,您应该使用名称空间,但在这种情况下,似乎需要某种类型的“几行的名称空间”…但该代码将在循环中运行,因此使用名称空间不是一个好主意…autoload将在我需要当前函数时为我提供全局类定义scope@shybovycha更改您的体系结构,当我需要当前函数时,AutoLoad将为我提供一个全局类定义cope@shybovycha改变你的架构,然后我不知道你实际上想要实现什么,使用
eval()
任何方式都是不好的做法。至于…@afuzzyllama,你对如何在一个代码块中使用一些文件代码而不使其可用于其他代码部分有更好的想法吗?你是在试图重写php核心函数还是添加自己的函数?@afuzzyllama我有我应该重写的“核心”代码(对于一个代码块-在其他代码块中,覆盖应该被取消)而不进行更改。另一个问题是,覆盖代码可能是类,也可能只是php代码。我不知道您实际想要实现什么,并且使用
eval()
任何方式都是不好的做法。至于…@afuzzyllama,你对如何在一个代码块中使用一些文件代码而不使其可用于其他代码部分有更好的想法吗?你是在试图重写php核心函数还是添加自己的函数?@afuzzyllama我有我应该重写的“核心”代码(对于一个代码块-在其他代码块中,重写应该被取消),而不更改它。另一个问题是重写代码可能是类,也可能只是php代码。