J'ai très peu de connaissances sur joomla core et PHP. Afin de mieux gérer mon site Web, j'essaie de lire une petite partie de joomla core, lorsque je tombe sur cette fonction JTable:getInstance
, (Libararies\joomla\table\table.php line268), elle retourne
return new $tableClass($db);
Pour comprendre ce que getInstance
renvoie, j'ai besoin de savoir comment est défini ce $tableClass
. Je l'ai donc recherché dans tous les fichiers php de mon site Web, bien qu'il y ait beaucoup de références, même des soi-disant 'définitions' comme cette page indique, aucune d’elles n’est ce que je recherche. J'attends quelque chose comme
class tableClass{...}
De plus, à partir d'autres fichiers php, il y a ces lignes:
$row = JTable::getInstance('K2Item', 'Table');
$row->hit($id);
Donc, il me semble que ce qui est retourné par getInstance
devrait être un objet ayant un membre hit()
, alors j'attends quelque chose comme
class tableClass{...
function hit(){
.....
}
}
Mais ce genre de code est introuvable, alors je suis coincé ici et j'ai vraiment besoin d'aide.
Certaines de mes pensées: $ tableClass est-il vraiment une classe? Je remarque qu'il a un $
, Que toutes les autres classes n'ont pas? Si ce n'est pas une classe, alors pourquoi pourrait-on l'invoquer comme ceci new $tableClass
? J'ai vraiment besoin de comprendre ces bases, mais il est difficile de trouver le mot clé Google $
.
$ tableClass est une variable. Vous ne trouverez pas de classe nommée "tableClass". C'est juste un espace réservé pour le nom de classe réel qui sera généré au début de la méthode getInstance.
Jetez un coup d’œil aux lignes 268 à 272 où getInstance commence:
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);
La première ligne de celle-ci définit les paramètres que vous pouvez transmettre ultérieurement à 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.
Donc, si vous regardez l'exemple que vous avez donné,
$row = JTable::getInstance('K2Item', 'Table');
"K2Item" est le nom de la classe JTable ($ type) et "Table" est le préfixe ($ prefix). [$ config n'a pas été défini car il est seulement optionnel et probablement pas nécessaire ici]
La ligne 271 ($type = preg_replace('/[^A-Z0-9_\.-]/i', '', $type);
) supprimera tous les caractères incorrects du paramètre $ type, ce qui signifie tous les caractères sauf les lettres (AZ), les chiffres (0 à 9) et les caractères '_', '.' Et ' - ' Il utilise un expression régulière pour cela.
À la ligne 272, $ tableClass (qui sera le nom de classe final à surveiller) est généré. Il prend le préfixe $ et concatène le type $ de la ligne précédente. ucfirst () est là pour convertir la première lettre de $ type en majuscule.
Quelques exemples:
JTable::getInstance('K2Item', 'Table');
$ tableClass deviendra "TableK2Item"
JTable::getInstance('C#!ont&ent');
$ tableClass deviendra JTableContent, en raison de la suppression du caractère incorrect et le préfixe $ est "JTable" par défaut.