【问题标题】:php require class call from inside methodphp需要从内部方法调用类
【发布时间】:2011-02-14 21:04:18
【问题描述】:

据我了解,需要将代码粘贴到调用 php 文件中。

如果您从方法内部要求...它会将整个代码/类粘贴到方法中,从而阻止方法中的下一条语句。

例如。

  function test() {

    require 'pathtosomeclasscode';
    somestatement; // any code after the require is blocked.

 }

我如何解决这个问题,以便能够在任何地方都需要代码,而不会将其粘贴到那个确切的位置?

【问题讨论】:

  • 为什么会阻塞下一条语句?
  • 它会使所有代码变形,例如。粘贴在函数中的类
  • @jera:事实并非如此。我在回答中已经说过了,但我会在此强调:您是否遇到了错误/故障,让您相信是这种情况?如果是这样,请向我们提供更多详细信息,以便我们纠正问题的根源。
  • icio 是正确的。这很好用(请参阅下面的示例代码)。如果您使用 require_once,而您的包含文件只定义了一个类,那么您实际上是在延迟加载类定义,尽管方式有些混乱。
  • 我在一个相关问题上苦苦挣扎,但谷歌搜索出错了,所以这里有一个链接指向可能有相同错误的人的解决方案:stackoverflow.com/questions/12242964/…

标签: php oop class require


【解决方案1】:

有点令人惊讶的是,这似乎工作得很好。包含的代码将在 Baz::bork() 的范围内执行——但代码只是定义了一个类,并且类是全局的。所以你最终得到了一个定义好的类。

文件:Foo.php:

<?PHP
class Foo{
      function bar(){
               echo "Hello from Foo::bar()!\n";
      }
}

文件:Baz.php:

<?PHP
class Baz{

      function bork(){
               require_once "Foo.php";
               $f = new Foo();
           $f->bar();
      }
}

echo "testing internal definition:\n";
$b = new Baz();
$b->bork();

echo "\ntesting in global scope:\n";

$f = new Foo();
$f->bar();
echo "\nall done\n";

输出:

$ php Baz.php
testing internal definition:
Hello from Foo::bar()!

testing in global scope:
Hello from Foo::bar()!

all done

现在,我想不出很多地方你会想以这种方式做事。人们通常 require_once() 任何可能的依赖项在他们的类文件的顶部,在类定义之外。

【讨论】:

  • 这在所需文件可变时很有用:require_once $dirName . "/../{$fileName}.php";
  • 如果文件还指定了命名空间,它会正确处理吗?是的,它确实有效。
  • @JamesPoulson 这对于有条件/延迟加载代码也很有用。例如。 wordpress 插件可能具有仅用于前端/后端/ajax 调用/特定页面等的代码。由于插件在知道您所在的页面/帖子之前加载,因此您需要延迟加载 wp 中的操作,这将调用是的,一个函数......这可以加快服务器端的速度,但也避免加载不必要的样式和脚本,减少不必要的请求......
【解决方案2】:

调用requirerequire_onceincludeinclude_once不会停止函数中代码的执行除非包含的脚本有问题时间>。包含文件中的代码与函数在相同的范围中执行(定义的函数和类是全局的),而不是插入其中,替换那里的其他代码。

其他答案建议使用require 的替代方案之一作为解决方案——如果脚本中的错误与命名冲突有关(即尝试重新定义类或函数),这些解决方案可能对您有用),否则您不妨向我们提供更多已发生(或未发生)的细节,让您认为有问题,以便我们帮助您解决真正的原因。

进一步说明,这些文件包含方法不会将代码粘贴到您的脚本中。 粘贴是人们用来维护文本的工具。我建议您阅读 PHP 手册以尝试进一步了解这些函数的工作原理:

如果您在调查后对他们的工作有进一步的疑问,请再次发布。

【讨论】:

    【解决方案3】:

    试试require_once?以防万一您将其包含在其他地方。

    【讨论】:

      【解决方案4】:

      如果你使用 include_once('script.php') 你不会遇到关于类被重新声明的错误。

      我自己没有尝试过以下方法,但我认为如果您不想重复 include_once(),此设置也可能有效:

      class Whatever {
      
          protected $classObject;
          public function __construct( /*...*/ ) {
              include('anotherClass.php');
              $this->classObject = new anotherClass();
          }
      
          public function someFunction( /*...*/ ) {
              $this->classObject->classObjectFunction();
          }
      
          public function anotherFunction( /*...*/ ) {
              $this->classObject->classObjectFunction();
          }
      }
      

      然后您可以调用以下代码,每个代码都会调用同一个共享类对象中的一个函数:

      $Whatever = new Whatever();
      $Whatever->someFunction();
      $Whatever->anotherFunction();
      

      【讨论】:

        【解决方案5】:

        我认为您的意思是您不希望代码立即执行。如果这是正确的,你有几个选择:

        1. 您可以移动需求。

        2. 您也可以使用 fopen() 读取文件,然后对其进行解析。 (你不能调用 eval 因为它不理解 HTML,但你可以用解析器来做)

        【讨论】:

          【解决方案6】:

          如我所见,您正在使用外部文件来加载类,对吗?你为什么不使用Autoloading Classes。我知道当你想在不同的情况下加载不同的类体时它不会起作用,但我真的不知道这是否是一个好习惯。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-07-22
            • 2011-12-21
            • 2023-03-23
            • 1970-01-01
            • 1970-01-01
            • 2011-05-29
            • 1970-01-01
            相关资源
            最近更新 更多