1

Wordpress環境内のテーマで作成したこのクラスがあります。

class Theme {
    function __construct()
    {
       add_action('after_setup_theme', array(&$this, 'do_this'));
    }

    function do_this()
    {
       require_once('helper_functions.php');
    }
}
$theme = new Theme();

そして、helper_functions.php内に私は持っています:

function get_image()
{
    return 'working';
}

しかし今、私はこれを実行すると困惑します

echo $theme->get_image();

動作しません....しかし、直接呼び出すと、次のように動作します。

echo get_image();

しかし、私はクラスメソッドを使用しているので、クラスオブジェクトを使用してクラスメソッドに到達する必要があると思いました...なぜそれを直接呼び出すことができるのですか?

4

5 に答える 5

0

明らかに、あなたはそれを間違った方法で理解しています。get_image()この場合、方法ではありません。これは、スクリプトの実行中に呼び出すことができるもう1つの通常の関数です。

メソッドにするには、クラス宣言内で宣言する必要があります。

class Theme 
{
    function __construct()
    {
       add_action('after_setup_theme', array(&$this, 'do_this'));
    }

    function do_this()
    {
       require_once('helper_functions.php');
    }

    function get_image()
    {
        return 'working';
    }
}

オブジェクトとクラスの詳細については、こちらをご覧ください。

于 2012-04-28T16:13:20.853 に答える
0

この関数get_image()は、クラスに設定されている関数ではなく、クラスThemeに含まれている別のファイルに設定されています。

クラスの関数にしたい場合は、クラスファイルに記述し、コードをクラスに移動する必要があります。

クラス拡張を利用できる代替手段

class Helper_functions  {

    public function get_image() {
        return "working!";
    }
}

そして、テーマクラスファイルをに変更します

class Theme extends Helper_functions {

    function __construct()
    {
       add_action('after_setup_theme', array(&$this, 'get_image'));
    }

}

$theme = new Theme();

代替案
いくつかのファイルにいくつかの関数があると言ったので、テーマクラスファイルまたは拡張クラスファイルのいずれかでこれを行うことができます。

class Theme {

    ...

    function get_image() { include('theme_file_get_image.php'); }
    function another_function { include('theme_file_another_function.php'); }
}
于 2012-04-28T16:18:07.633 に答える
0

この質問の答えは、ここに表示されている結果を要約したものです。

「インクルードされたファイル内のコードは、関数と同じスコープで実行され(定義された関数とクラスはグローバルです)、挿入されず、他のコードが置き換えられます。」

したがって、インクルードされたファイル内の関数はグローバルスコープで定義されます。これが、の呼び出しがget_image()機能する理由です。

これは次と同等である必要があります。

//Include the helper functions
require_once('helper_functions.php');

class Theme 
{
    function __construct()
    {
       add_action('after_setup_theme', array(&$this, 'do_this'));
    }

    function do_this()
    {
       get_image();
    }
}

$test = new Theme();
echo $test->do_this(); //'working';

get_image()はグローバルスコアにあり、Themeクラスのメンバー関数ではないことに注意してください。

于 2012-04-28T16:18:23.730 に答える
0

includeとrequireは、ファイルの内容を親スクリプトに「コピー/貼り付け」するようなものとよく言われますが、それはあなたが期待していることのようです。しかし、それは実際には正しくありません。そのため、あなたがしていることはうまくいきません。

一部の言語には、コードを解釈する前にテキスト置換を行うコンパイラマクロがあるため、wporkになります。ただし、phpはそうではなく、すべてのincludeステートメントは実行時に評価されます。あなたの場合、そのrequireステートメントが実行される前に、クラスは完全に定義されています。その結果、グローバル関数を定義するコードを実行しているだけです。

于 2012-04-28T16:20:34.280 に答える
0

クラス定義を分割することはできません。すべてを一度に行う必要があります。クラスが大きすぎる場合は、責任が多すぎる可能性があります。

  • ビジネスロジックをファクトリロジックから分離します(ファクトリロジックは新しいオブジェクトをインスタンス化するロジックであり、ビジネスロジックそれらのオブジェクトです)。
  • 関数ごとにクラスを分けます。
  • 継承とポリモーフィズムを使用します。

関数内にファイルを含めると、そのファイルはその関数のスコープ内にのみ存在します。あなたがしたことは次と同等です:

public function do_this() {
    function get_image() { ... }
}

これは実際には何もしません。

于 2012-04-28T17:17:02.647 に答える