1

HTMLタグを作成するためのPHPクラスがあります。各HTMLタグは新しいインスタンスになります。属性のエスケープなどの特定の機能を処理したり、すべてのインスタンスに影響する特定のオプションを構成したりするために、クラス内に必要なユーティリティメソッドがいくつかあります。ユーティリティを宣言しpublic static、クラス内でself::ユーティリティメソッドを呼び出しています。すべてのメソッドを1つのクラスに保持する、ユーティリティ用に別の静的クラスを作成して、メインクラスが静的クラスを拡張するようにする(メソッドを引き続き呼び出すことができるようにするself::)方がよいと思いますか?この種の状況に対処するための最良の方法は何ですか?(PHP 5.2以降)クラスのインターフェースは次のようになります。

foo('div')->attr('id', 'example')->html('this is inner text')->get();

foo('img')->attr(array('src' => 'example.png', 'alt' => 'example'))->get();

基礎となるコードの例:

public function attr($name, $value = '')
{
    if (is_scalar($name))
    {
        if (empty($name) && !is_int($name)) $this->attrs[] = $value; 
        else $this->attrs[$name] = $value;
    }
    else
    {
        foreach ((array) $name as $k => $v)
        {
            $this->attr($k, $v);
        }
    }
    return $this;
}

// handler (doesn't get called until it's time to get)
public static function attr_encode($name, $value = '')
{
    if (is_scalar($name))
    {
        if (is_int($name)) return self::attr_encode($value, '');
        $name = preg_replace(self::ATTR_NAME_INVALIDS, '', $name);
        if ('' === $name)  return '';
        if (1 === func_num_args() || '' === $value) return $name;

        $value = is_null($value) ? 'null' : ( !is_scalar($value) ? (
                 self::supports('ssv', $name) ? self::ssv_implode($value) : json_encode($value)) : (
                 is_bool($value) ? (true === $value ? 'true' : 'false') : self::esc_attr($value)));

         return $name . "='" . $value . "'";     // Use single quotes for compatibility with JSON.
    }

    // Non-scalar - treat $name as key/value map:
    $array = array();
    foreach ((array) $name as $attr_name => $attr_value)
    {
        self::push($array, true, self::attr_encode($attr_name, $attr_value));
    }
    return implode(' ', $array);
}
4

3 に答える 3

1

このトピックでは、静的クラスを使用する方法、時期、時期について、いくつかの良い情報を提供します。

静的クラスとインスタンス化されたクラスをいつ使用するか

また..あなたは書いた:

クラスのインターフェースは次のようになります。

PHP/OOPのインターフェースは別のものです。インターフェイスは、プログラマーにクラスで特定のメソッドを使用するように強制します。

于 2012-05-04T19:46:12.750 に答える
1

LINQ to XMLクラスに似たものを構築しているようです: http: //broadcast.oreilly.com/2010/10/understanding-c-simple-linq-to.html#example_1またはhttp://phphaml.sourceforge 。ネット/

おそらく、そこに適応できるいくつかのインターフェーススタイルがあります。

于 2012-05-04T23:35:54.413 に答える
0

名前空間でSTATICを使用するライブラリで使用する独自のPHP5HMVCプロジェクトを構築しています。

\Project\library\output::set_header_status(100);

しかし、あなたの問題を想像してみてください。

  • 一部の関数を呼び出す前に関数を追加するか、次のように回避します。

    $output = \Project\library\output->log(true, 'directory_log_of_header/');
    
    \Project\library\output::set_header_status(100);
    

それで、問題がありました。この例は機能しません。このサンプル関数の代わりに、STATICを使用してこれを回避し$this、新しいインスタンスを使用して呼び出します。

関数を追加する必要がある場合は、変数をいくつか入れて、関数を呼び出す準備をnon-staticします。usingインスタンスを使用する必要があります。


STATICメソッドを使用しているのは、事前の準備関数なしで関数を直接呼び出す場合、変数を設定する場合、またはカウンターの場合、または静的を使用する必要がある変数を設定する場合のみです。たとえば、GET / POSTデータを呼び出す場合や、CLEARING CACHEを直接呼び出す例(非静的なしでファイルからキャッシュを直接削除する例)の場合があります。

  • 静的のみを使用している場合、インスタンスを呼び出しているインスタンスの数はわかりません。クラスに別のインスタンスを呼び出す必要がある場合は、より良いソリューションが実際にを使用してnon-staticいます。

    STATICメソッドを使用してプロジェクトを構築する人は、静的メソッド/クラス/関数がどこで呼び出されるかを適切に分析できません。これは、将来のビジネスの保守と開発にとっては困難です。

    関数が小さなタスクを提供し、頻繁に変更されないデータを直接取得する場合、または小さなタスクを変数、ダミーデータ(例:バージョン、チェック、カウンター、チェッカー)、HASHアルゴリズムなどとして提供する場合にのみSTATICを使用します。

于 2013-04-12T10:41:38.207 に答える