Une phrase à emporter: les constantes de Classe peut être plus rapide, mais la mémoire ne sera probablement pas d'importance, et à l'aide de l' Injection de Dépendance Modèle de Conception sera plus efficace en terme de mémoire et flexible.
Tandis qu'une constante de classe ou propriété statique sera plus rapide que de créer un tableau dans une fonction (voir bwoebi réponse) parce qu'il est intégré dans la mémoire une fois et peut être consulté à plusieurs reprises, il n'est en aucune façon la méthode la plus efficace disponible, ou la méthode recommandée pour résoudre le problème à la racine de l'OP cherche à résoudre.
Si vous êtes certain qu'aucune donnée n'est jamais va changer dans l'avenir, ou vous n'êtes jamais allez vouloir utiliser des jeux de données différents à des moments différents, même pour les tests, vous pouvez être en mesure de s'en tirer avec cette méthode, de toute façon. Si vous voulez plus flexible de code, les constantes de classe ou de propriétés statiques peuvent causer de sérieux problèmes. Comme je l'expliquerai plus tard, la quantité de mémoire utilisée ou enregistrée est peu probable que la matière. De plus en plus important à prendre en compte:
- Comment facile est-ce que ça va être de modifier mon code dans l'avenir?
- La flexibilité est mon code à l'évolution des circonstances
- Comment est-il facile de l'unité de tester mon code?
Avant de s'engager à la plus efficace en terme de mémoire route, assurez-vous d'équilibrer d'autres formes de l'efficience, de l'efficacité de votre temps dans le développement et le débogage.
Pourquoi la Mémoire ne peut pas d'importance
En raison de la vitesse des ordinateurs modernes, les performances frappé vous de l'expérience entre les deux versions devraient rarement faire une différence. Disk I/O est plus souvent un problème de mémoire. Si votre serveur fonctionne sur une TRÈS petite quantité de mémoire et vous vous attendez à volume très élevé, alors la mémoire de l'efficacité de votre code sera plus important que si vous avez de volume modéré et modérée de la mémoire.
Pour mettre les choses en perspective, voir cet article sur l'efficacité de tableaux en PHP. La vente à emporter? Même si PHP5 tableaux sont horriblement inefficace, même un tableau de 100 000 entiers prendra environ 14M. C'est BEAUCOUP, mais étant donné que la moyenne script PHP a une limite de mémoire de 128MO, et le minimum de recommandations pour le serveur d'appel d'environ 2 GO de mémoire, ce semble soudain différent.
Cela signifie que vous devriez vous inquiéter à ce sujet si le reste de votre code est inefficace, ou vous avez un volume élevé, comparativement à une insuffisance de mémoire. Qui sera la cause de votre demande de ralentir et/ou de votre système à planter.
Peu importe, dans une situation où vous êtes à explorer les choix architecturaux depuis le début, je vous recommande fortement d'un modèle de conception. À savoir, l' Injection de Dépendance modèle de conception. C'est pour un certain nombre de raisons, y compris le code de la flexibilité et de tests unitaires, mais aussi chaleureuse empreinte mémoire. De ce fait, il serait probablement être considérées comme des bonnes pratiques sur l'une de ces deux options vous sont recommander.
Pourquoi ne pas statique de propriétés
Au départ, l'itinéraire le plus simple est d'utiliser les propriétés statiques. Cependant, dans mon expérience, la route la plus facile n'est pas toujours le meilleur itinéraire, et peut souvent être le plus difficile à maintenir. Un problème, c'est que vos fonctions/méthodes seront probablement appel d'une autre classe à l'intérieur. Comme exemple, nous allons créer deux classes: MyFooClass
et DoStuff
, et de voir comment ils peuvent interagir par défaut.
class MyFooClass
{
public static $Ms = array(82, 83, 84, 104, 106, 107, 109, 140, 190);
public static $Gs = array(0, 1, 20, 21, 28, 90, 91, 92);
public static $Ts = array(0, 1);
}
class DoStuff
{
public function oneOfThousands()
{
$array = MyFooClass::$Gs;
//... do stuff
}
}
Maintenant, si jamais vous voulez insérer différentes valeurs de tableau à des fins différentes, ou si vous voulez de l'unité de test avec moins ou plus de paramètres, les complications abondent.
L'Injection de dépendance à la Rescousse!
Comme tous les modèles de conception de l'Injection de Dépendance résout un problème. Dans ce cas, le problème est facilement et efficacement la transmission de valeurs entre plusieurs fonctions/méthodes, sans sacrifier la flexibilité. À l'aide d'une base DI motif, vous pouvez obtenir vos tableaux initialisés dans la non-propriétés statiques et passer un seul objet contenant cette propriété de tableau pour chaque partie de votre code. Qui vous permettra d'éliminer vos inquiétudes à propos de la performance.
Exemple:
class MyFooClass
{
private $Ms, $Gs, $Ts;
public function __construct()
{
$this->Ms = array(82, 83, 84, 104, 106, 107, 109, 140, 190);
$this->Gs = array(0, 1, 20, 21, 28, 90, 91, 92);
$this->Ts = array(0, 1);
}
public function checkFileGcodeFormat()
{
if (! ($this->hasM() && $this->hasNoXYZ() && in_array($this->M, $this->Ms)) || ($this->hasG() && in_array($this->G, $this->Gs)) || ($this->hasT() && $this->hasNoXYZ() && in_array($this->T, $this->Ts)) )
return false;
else
return true;
}
}
// DI here:
$foo = new MyFooClass();
$bar = new MyBarClass();
$bar->setArrays($foo);
//alternative DI approach - parameters in constructor
$bar = new MyBarClass($foo);
Dans votre MyBarClass
, de l'affectation d'un MyFooClass
objet à une propriété $foo
. Vous pouvez ensuite appeler une méthode publique ou d'une propriété de cet objet en $this->foo
. Par exemple: $this->foo->checkFileGcodeFormat()
.
Avec ce modèle de conception:
- Lorsque vous souhaitez développer une nouvelle unité de test, il sera beaucoup plus facile de le faire.
- Si jamais vous voulez/besoin de mettre en œuvre un sous-ensemble de Gcodes pour une application, il suffit de passer un objet différent avec différentes valeurs de tableau.
- De même, si vous voulez tester un nouveau Traitement sur une nouvelle classe sans la présenter à chaque partie de votre script, vous pouvez.
- La mémoire consacré est de la taille d'un pointeur en PHP (qui est la même que la taille d'un pointeur en C... 8 octets dans une architecture en 64 bit).
Conclusion
- Si vous le pouvez, je vous conseille d'utiliser l'Injection de Dépendance Modèle de Conception.
- Vous pouvez choisir une propriété statique pour une meilleure empreinte mémoire (note: Ce n'est pas mutuellement exclusif de l'Injection de Dépendance, mais il est moins important si vous utiliser l'Injection de Dépendance).
- Dans un standard de configuration du serveur web, avec un trafic modéré, il est peu probable que votre consommation de mémoire n'aura d'importance, si vous utilisez des propriétés statiques ou appelez un tableau à partir de l'intérieur d'une fonction.