php需要从inside方法调用类

时间:2010-05-02 23:50:25

标签: php oop class require

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

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

例如

  function test() {

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

 }

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

6 个答案:

答案 0 :(得分:19)

有些令人惊讶的是,这似乎工作得很好。包含的代码将在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

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

答案 1 :(得分:7)

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

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

另外请注意,这些文件包含方法不会粘贴代码到您的脚本中。 Pasting 是人们用来维护文本的工具。我建议你阅读PHP手册,试着进一步理解这些功能的工作原理:

如果你在调查后对他们的工作有进一步的问题,请再次发帖。

答案 2 :(得分:1)

尝试require_once?只是把你的其他地方包括在内。

答案 3 :(得分:1)

如果您使用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();

答案 4 :(得分:0)

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

  1. 您可以移动要求。

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

答案 5 :(得分:0)

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