web-dev-qa-db-fra.com

Où function_exists () cherche-t-il à déterminer si une fonction existe?

La documentation dit:

Vérifie la liste des fonctions définies, à la fois intégrées (internes) et définies par l'utilisateur, pour nom_fonction. (SOURCE:http://php.net/manual/en/function.function-exists.php )

La fonction analyse-t-elle simplement le document php unique en utilisant function_exists, en recherchant les fonctions correspondantes?

Par exemple, si j'ai if ( function_exists( 'get_custom_header' ) dans header.php, la fonction cherchera-t-elle get_custom_header dans header.php?

Ou bien la fonction cherche-t-elle dans d'autres répertoires et/ou fichiers, tels que functions.php ou dans d'autres fichiers du noyau wordpresss (c'est-à-dire le dossier wp-admin ou le dossier wp-includes)?

2
Daniel Dropik

function_exists('f') vérifiera si une fonction f a été déclarée avant l'appel à function_exists. Par conséquent, la réponse directe à votre question est la suivante: dans la section Fonctions de la mémoire de l’interprète.

Le résultat de function_exists ne dépend pas seulement du fichier dans lequel la fonction est déclarée et du fichier dans lequel l'appel est effectué, mais également du chemin d'exécution.

function a() {}
-- at another file executed later
echo function_exists('a');

// displays true

tandis que

echo function_exists('a');
// display false;
-- at another file executed later
function a() {}

function_exists situé dans le même fichier que la définition de la fonction (ce qui est un cas d'utilisation trivial et non intéressant) renvoie toujours la valeur true, car l'interpréteur analyse toutes les fonctions avant de commencer à exécuter le fichier.

Ajoutons à l’amusement le fait que les fonctions imbriquées sont définies uniquement lorsque leur parent est évalué et que toutes les fonctions php se trouvent dans la portée globale, ce qui pourrait conduire à:

function a() {
  function b() {}
}

echo function_exists('b');

// displays false

tandis que

function a() {
  function b() {}
}

a();
echo function_exists('b');

// displays true

Dans un code gros et complexe comme wordpresspress, il n'est pas trivial de prédire le résultat de function_exists, ce qui explique probablement pourquoi Core n'utilise plus ce modèle. Si vous avez le choix, utilisez plutôt des crochets.

2
Mark Kaplun

Yesla fonction phpfunction_existsbalaie simplement la fonction uniquement dans le fichier où elle se trouve, mais pas dans les fichiers inclus après la condition de function_exists. Donc, afin de vérifier la fonction, la fonction avec fichier doit être incluse au-dessus de la condition function_exists.

Cela fera écho à oui parce que la fonction est incluse dans le fichier avant qu'il ne vérifie la condition.

include('ext_include.php');
if (function_exists('look')) {
    echo "yes";
} else {
    echo "no";
}

Cela ne fera pas écho oui, mais fera écho non

if (function_exists('look')) {
    echo "yes";
} else {
    echo "no";
}
include('ext_include.php');

NOTE: ext_include.php est le fichier php qui a la fonction look

J'espère que cela t'aides.

0
sun

Lorsque l'analyseur PHP analyse les fichiers, de votre index.php initial au fichier actuel contenant votre function_exists, il lit chaque variable, fonction, classe, méthode, propriété ... littéralement, et les stocke dans une grande Table de hachage . Fondamentalement, les noms de ces méthodes/variables sont hachés et utilisés comme clés.

Désormais, lorsque vous appelez function_exists, il hache le nom de la fonction et recherche dans cette table de hachage une clé correspondante. Ainsi, il sait tout jusqu'à ce que vous appeliez la fonction, y compris ce que contient chaque fichier inclus avec include et require. Mais il ne sait rien de ce qui vient plus tard.

0
Twifty