Je ne suis pas sûr si le terme "Wildcard" peut expliquer mon point, mais parfois dans certains scripts prêts, nous sommes en mesure d'appeler une fonction non définie comme find_by_age(23)
où l'âge peut être tout ce qui est mappé à une base de données enregistrement de table. Donc, je peux appeler find_by_name
, find_by_email
, find_by_id
et ainsi de suite. Alors, comment pouvons-nous faire une telle chose soit de manière procédurale ou orientée objet?Caractères génériques dans les fonctions PHP
Répondre
Le terme que vous recherchez est méthode magique.
Fondamentalement comme ceci:
class Foo {
public function __call($method,$args) {
echo "You were looking for the method $method.\n";
}
}
$foo = new Foo();
$foo->bar(); // prints "You were looking for the method bar."
Pour ce que vous cherchez, vous filtrez simplement des appels mauvais de fonction et de réacheminer bons:
class Model {
public function find_by_field_name($field,$value) { ... }
public function __call($method,$args) {
if (substr($method,0,8) === 'find_by_') {
$fn = array($this,'find_by_field_name');
$arguments = array_merge(array(substr($method,8)),$args);
return call_user_func_array($fn,$arguments);
} else {
throw new Exception("Method not found");
}
}
}
Pourquoi 'new Foo() -> bar() 'n'est pas autorisé? –
'new Foo() -> bar()' entraîne une erreur de syntaxe: "unexpected" -> '(T_OBJECT_OPERATOR) ". Cela est vrai à la fois pour PHP 5.3 et PHP 5.4. Je ne l'ai pas encore essayé en PHP 5.5. –
Je viens de confirmer qu'il s'agit toujours d'une erreur de syntaxe dans PHP 5.5, mais ils ont corrigé le déréférencement string/array (comme 'foo() [3]' ou ''xyz '[1]'), ce qui est un problème similaire. –
Vous pouvez les utiliser en définissant une méthode magique __call
dans votre classe, vous ne pouvez les utiliser que dans les classes. sur la portée mondiale
Je cite PHP Manual:
<?php
class MethodTest {
public function __call($name, $arguments) {
// Note: value of $name is case sensitive.
echo "Calling object method '$name' "
. implode(', ', $arguments). "\n";
}
/** As of PHP 5.3.0 */
public static function __callStatic($name, $arguments) {
// Note: value of $name is case sensitive.
echo "Calling static method '$name' "
. implode(', ', $arguments). "\n";
}
}
$obj = new MethodTest;
$obj->runTest('in object context');
MethodTest::runTest('in static context'); // As of PHP 5.3.0
?>
L'exemple ci-dessus sortie:
Calling object method 'runTest' in object context
Calling static method 'runTest' in static context
Pour une solution de procédure, vous pouvez utiliser simplement la chaîne concaténation pour faire le travail. Vous pouvez également imaginer un peu les choses en l'appelant une implémentation du strategy pattern.
<?php
/**
* Employ a find by name strategy
*/
function find_by_name($name)
{
echo "You are searching for users with the name $name";
return array();
}
/**
* Employ a find by age strategy
*/
function find_by_age($age)
{
echo "You are searching for users who are $age years old";
return array();
}
/**
* Find users by using a particular strategy
*/
function find_using_strategy($strategy='age', $parameter)
{
$results = array();
$search_function = 'find_by_' . $search_field;
if (function_exists($search_function)) {
$results = $search_function($parameter);
}
return $results;
}
$users = find_using_strategy('name', 'Matthew Purdon');
var_dump($users);
- 1. Fonctions génériques dans VB.NET
- 2. Grille Afficher les fonctions génériques
- 3. Caractères génériques dans Lucene
- 4. Caractères génériques dans les vues avec CouchDB?
- 5. Chaîne de recherche Php (avec caractères génériques)
- 6. Caractères génériques et méthodes génériques
- 7. caractères génériques dans Java PreparedStatements
- 8. Caractères génériques dans l'instruction GRANT?
- 9. Caractères génériques FindFirstFile (Ex)
- 10. requête Lucene.Net avec les principaux caractères génériques
- 11. C# XmlDocument.LoadXml et les caractères génériques
- 12. fichier batch caractères génériques
- 13. preg_replace: les caractères génériques ne correspondent pas aux caractères truqués
- 14. Xcode Caractères génériques?
- 15. PHP: Comment rechercher un fichier en utilisant des caractères génériques
- 16. PHP + MySQL: recherche en utilisant des caractères génériques
- 17. Combinaison de caractères génériques délimités dans Java
- 18. compter les caractères dans php
- 19. Utilisation de caractères génériques dans CodeIgniter
- 20. fonction de recherche php en utilisant des caractères génériques
- 21. caractères génériques dans MS Access SQL
- 22. Comment supprimer les cookies de caractères génériques dans Rails?
- 23. Caractères génériques pour les ressources dans un contexte Tomcat Servlet.xml
- 24. Caractères génériques dans les paramètres T-SQL LIKE vs. ASP.net
- 25. Les caractères génériques sont-ils autorisés dans le fichier sitemap.xml?
- 26. J'ai des problèmes avec les caractères génériques dans le tableau
- 27. Web.config: caractères génériques dans l'emplacement et l'autorisation
- 28. Sélecteur de caractères génériques Mootools
- 29. Java classes génériques non typées, supprimant leurs fonctions types génériques
- 30. Les champs 'texte' Solr n'acceptant pas les caractères génériques
double possible (http://stackoverflow.com/questions/3456763/magic-functions-call-for-functions) – Artefacto
TIP [fonctions magiques __call() pour les fonctions?]: Vous devez indexer les champs vous recherchez la table avec. Plus la table est grande (nombre de champs, tailles variables (varchar) et types de blob, nombre de lignes) plus la recherche sur une rangée de tables est longue. – OIS