web-dev-qa-db-ja.com

$ tableClassクラスはどこに定義されていますか?

JoomlaコアとPHPについての知識はほとんどありません。私のウェブサイトをよりよく処理するために、私はjoomlaコアの小さな部分を読み込もうとしています。この関数_JTable:getInstance_、(libararies\joomla\table\table.php line268)に遭遇すると、それは

_    return new $tableClass($db);
_

getInstanceが何を返すかを理解するには、この_$tableClass_がどのように定義されているかを知る必要があるため、Webサイトのすべてのphpファイルで検索しました。 このページ が指摘する定義として、それらのどれも私が探しているものではありません。私はのようなものを期待しています

_class tableClass{...}
_

さらに、他のphpファイルには、次の行があります。

_$row = JTable::getInstance('K2Item', 'Table');
$row->hit($id);
_

だから私には見えます、getInstanceが返すものはhit()のメンバーを持つオブジェクトであるはずなので、次のようなものを期待しています

_class tableClass{...
    function hit(){
    .....
    }
}
_

しかし、この種のコードはどこにも見つからないので、私はここで立ち往生しており、間違いなく助けが必要です。

私の考えのいくつか:$ tableClassは本当にクラスですか?他のすべてのクラスにはない_$_があることに気づきましたか?クラスではない場合、なぜこのように呼び出すことができますか_new $tableClass_?私はこれらの基本を本当に理解する必要がありますが、キーワード_$_をグーグル検索するのはちょっと難しいです。

5
shenkwen

$ tableClassは変数です。 「tableClass」という名前のクラスは見つかりません。これは、getInstanceメソッドの最初に生成される実際のクラス名のプレースホルダーにすぎません。

GetInstanceが始まる268行目から272行目を見てください。

_public static function getInstance($type, $prefix = 'JTable', $config = array())
{
    // Sanitize and prepare the table class name.
    $type       = preg_replace('/[^A-Z0-9_\.-]/i', '', $type);
    $tableClass = $prefix . ucfirst($type);
_

この最初の行は、後でgetInstanceに渡すことができるパラメーターを定義します。

_ $type    The type (name) of the JTable class to get an instance of.
 $prefix  An optional prefix for the table class name.
 $config  An optional array of configuration values for the JTable object.
_

だからあなたが与えた例を見れば、

_$row = JTable::getInstance('K2Item', 'Table');
_

「K2Item」はJTableクラス($ type)の名前で、「Table」は接頭辞($ prefix)です。 [$ configはオプションであり、おそらくここでは必要ないため、設定されていません]

行271($type = preg_replace('/[^A-Z0-9_\.-]/i', '', $type);)は、$ typeパラメーターからすべての無効な文字を削除します。つまり、文字(AZ)、数字(0-9)、および文字 '_'、 '。'、 'を除くすべての文字を削除します-'。 正規表現 を使用しています。

272行目で、$ tableClass(最後に確認するクラス名)が生成されます。 $ prefixを受け取り、前の行の$ typeを連結します。 ucfirst()は、$ typeの最初の文字を大文字に変換するためのものです。

いくつかの例:

_JTable::getInstance('K2Item', 'Table');
_

$ tableClassは "TableK2Item"になります

_JTable::getInstance('C#!ont&ent');
_

$ tableClassは、不正な文字の削除のためにJTableContentになり、$ prefixはデフォルトで「JTable」になります。

6
fruppel