Méthode php call class de la méthode statique à l'intérieur de la même classe mais non instanciée
php 5.3+
Désolé pour la longue question, mais je veux apprendre cette complètement.
Je sais que je ne peux pas appeler un non-statique de la même méthode de classe de l'intérieur d'une méthode statique, sans la classe instanciée comme un objet.
class Person
{
private $people_array;
function data_all_get()
{ //touch database, return array of people
$this->people_array = //etc dbquery results
}
static function showPeople()
{ //call class method
$people_data = $this->data_all_get();
//Fatal error: Using $this when not in object context
}
} //end class Person
De recherche, j'ai trouvé certaines des approches intéressantes, mais vous vous demandez comment chaque approche affecte le code de l'environnement.
Mes questions sont ci-dessous:
Je pourrais instancier la classe comme un objet à l'intérieur de la méthode statique, pour accéder à la non-méthode statique
static function showPeople()
{ //instantiate as object
$person = New Person();
//call class method
$people_data = $this->data_all_get();
}
Q1 - quels sont les problèmes que cela pourrait-il provoquer ?
dans ma situation, la classe ne possède pas de constructeur, donc pas d'autres méthodes de la classe ni vars seraient touchés par l'instance. Serait-ce le nouvel objet, il suffit de prendre un peu d'espace dans la mémoire pendant l'exécution du script? Ne semble pas trop mauvais...
l'autre option serait de convertir le "data_all_get" de la méthode dans une méthode statique, de sorte qu'il pourrait être appelé à partir de l'intérieur de la méthode statique "showPeople", c'est à dire
self::showPeople()
la "data_all_get" la méthode est utilisée par d'autres méthodes dans la classe lorsqu'il est instancié comme un objet, pour définir la valeur de la private var, afin de réduire les voyages à la base de données, si elle est déjà définie. Je sais que c'est probablement ce qui pourrait être une partie d'une fonction constructeur, mais je n'ai jamais besoin de cette "Personne" de l'objet à instatiated plus d'une fois par script php requête, la classe est principalement utilisé pour les fonctions de groupe et de vars ensemble de l'organisation ...
Q2 - quelles sont les implications de "faire data_all_get" dans une méthode statique ?
y at-il? si la méthode est statique, mais il définit la valeur de la private var $people_array (ce qui n'est pas statique), je pense qu'var serait en mesure d'être mis à jour ou remplacée si l'objet a jamais besoin d'être instancié une deuxième fois dans une seule demande de script, correct? Plus depuis la propriété n'est pas statique d'autres méthodes de la classe peut accéder.
T3 - Pourrais-je appeler la méthode statique "data_all_get" autant de fois que je voulais, sans "casser quoi que ce soit" (une question piège IK).
T4 - T-il tout simplement utiliser de la mémoire supplémentaire à chaque fois que la méthode statique est appelé?
Merci
source d'informationauteur Steve Wasiura
Vous devez vous connecter pour publier un commentaire.
Seulement quelques notes, certains peut-être évident. 1) Comme vous n'êtes pas de retour, donc, évidemment, le code ci-dessus échoue. Il n'y a rien de mal, pour dire, avec le code ci-dessus. En réponse à votre T1 tout ce que vous avez fait est de prendre une paire d'appels de fonction à l'aide d'une variable globale et encapsulé à l'intérieur d'une classe. Je ne vous le conseille parfois l'utilisation de ce comme un instancié de la classe et, parfois, de ne pas le faire, car il fera de votre code moins lisible et plus difficile pour les gens à comprendre quand ils sont à la recherche.
Si vous êtes inquiet au sujet de l'instanciation de ce plus d'une fois, vous voudrez peut-être consulter le modèle de conception singleton, mais en général, si vous avez l'intention de créer une instance de la classe à un certain moment, je re-examiner pourquoi vous appelez ces statiquement dans la première place. Il n'y a rien de mal à cela, pour dire, les autres qu'il se sent "mauvais" pour moi.
T2) La seule implication de faire data_all_get dans un tableau statique est alors c'est de la référence d'une propriété statique, qui à son tour signifie que cette propriété est inaccessible si instancié. Aussi, vous êtes de perdre la possibilité d'instancier plusieurs versions de cette classe (si c'est important) et, fondamentalement, tournant people_array dans une variable globale. Ce n'est pas nécessairement une mauvaise chose, mais sans savoir ce que le reste de votre fonctionnalité est en train de faire, il est difficile de dire ce que seront les conséquences.
T3) La seule question à plusieurs reprises est Une) de l'anéantissement de tout ce qui est dans les gens tableau, et B) de Plusieurs DB appels. Sans voir ce que les autres code va sur cette question est plus ou moins impossible de répondre.
T4) La mémoire d'une méthode pour la taille de ce que vous avez énumérés ici est négligeable au point de n'être pas la peine de parler. Le souci vient avec la DB appel lui-même, et le nombre de lignes qui sont accessibles sur le site
Enfin, c'est un peu bizarre que vous avez ce code écrit maintenant, depuis showPeople fait la même chose exacte que data_all_get. Vous avez probablement envie de écrire un peu de logique à l'intérieur de showPeople pour voir si $people_array est vide ou non, et si oui, exécutez data_all_get et si non, retour people_array. Cela permettra d'éviter supplémentaires DB lit. Si vous allez à aller lire la DB à chaque fois de toute façon, alors vous pourriez aussi bien avoir data_all_get return $people_array, auquel cas rien de tout cela doit être à l'intérieur d'une classe, et il peut juste être un appel de fonction qui renvoie ce qu'il trouve dans la db.