-1

スーパーオブジェクトを持つオブジェクト指向の HMVC を開発する際、アプリケーション プロセスのある時点で名前空間を使用する必要がありました。ここで、名前空間は、同じ方法でアクセスできるさまざまなコードを「バージョン管理」する方法として機能します。以下の縮小された例でFooqux、バージョンAまたはB. self::問題がなくなるのではなく、使用すれば問題がなくなることは理解してい$thisますが、これは避けたいと思います。現時点では、次の PHP エラーが発生します。

Fatal error: Using $this when not in object context

私の質問は、$thisこの特定のコンテキストでどのように使用できますか?

namespace
{
    $gamma = new \Gamma();
    $gamma->execute('A', 'Foo', 'qux');

    // ...

    class Alpha
    {
        // ...
    }
    class Beta extends Alpha
    {
        public function foo($input)
        {
            echo $this->bar($input);
        }
        public function bar($input)
        {
            return $input;
        }
    }
    class Gamma extends Beta
    {
        public function execute($space, $class, $method)
        {
            call_user_func_array(array($space . '\\' . $class, $method), array());
        }
    }
}
namespace A
{
    class Foo extends \Gamma
    {
        public function qux()
        {
            $this->foo('I like turtles');
        }
    }
}
namespace B
{
    class Foo extends \Gamma
    {
        public function qux()
        {
            $this->foo('I like strawberries');
        }
    }
}

予想される出力は次のとおりです。

"I like turtles"

アドバイス、回答、ガイダンスは大歓迎です。:3

4

2 に答える 2

1

解決しました。

call_user_func_array関数を介して静的にクラスを渡していました。そのため、使えませんでした$this。したがって、要求されたクラスの開始が必要になり、次のように変数として渡されます。

// ... Continuing from Beta::execute() ...
$class = $space . '\\' . $class;
$class = new $class();
call_user_func_array(array($class, $method), array());
于 2013-02-22T20:01:39.753 に答える
0

これが抽象メソッドの目的です。

Master抽象クラスおよびqux抽象メソッドとして宣言する必要があります。

abstract class Master
{
    public function __construct()
    {
        $this->qux();
    }
    abstract public function qux();
}

class Foo extends Master
{
    public function qux()
    {
        ....
    }
}
于 2013-02-22T17:11:02.383 に答える