12

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

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

例如。

  function test() {

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

 }

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

4

6 回答 6

21

有点令人惊讶的是,这似乎工作得很好。包含的代码将在 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() 在他们的类文件顶部,在类定义之外的任何可能的依赖项。

于 2010-05-03T00:58:04.347 回答
7

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

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

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

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

于 2010-05-03T00:50:17.783 回答
1

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

于 2010-05-02T23:53:56.983 回答
1

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

我自己没有尝试过以下操作,但我认为如果您不想重复包含_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();
于 2010-05-03T00:04:53.067 回答
0

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

  1. 您可以移动需求。

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

于 2010-05-03T00:59:03.203 回答
0

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

于 2010-05-04T14:44:55.447 回答