2012-10-21 3 views
1

Je commence juste à apprendre PHP. Désolé, si c'est une question de débutant mais je me demande comment fonctionnent les méthodes. Par exemple, si je voulais supprimer des espaces blancs au début d'une chaîne. Dans Ruby, je qualifierais quelque chose comme:Différences entre les méthodes en PHP et Ruby

string.strip! 

Mais en PHP, je dois faire quelque chose comme:

trim(string); 

De toute évidence, la version Ruby est plus élégante (en termes de orienté objet conception), mais je me demande comment cela fonctionne pour PHP et d'autres langages tels que Java. Y a-t-il un nom pour concevoir des fonctions/méthodes de cette façon (en PHP)? Et où sont ces méthodes définies et pourquoi peuvent-elles être accessibles n'importe où? Merci beaucoup d'avance!

+3

PHP n'est pas entièrement orienté objet. Vous pouvez l'écrire, mais PHP lui-même ne l'est pas. Certaines personnes aiment l'appeler objet capable. */moi canards pour la couverture * – PeeHaa

+2

Ne regardez pas PHP quand vous regardez trop de langues. – quantum

+0

@PeeHaa: assez bien; Je rétracte mon commentaire :) –

Répondre

7

Il y a deux paradigmes différents ici: programmation orientée objet (POO) et programmation procédurale. Dans OOP, les fonctions sont définies dans le contexte des données, encapsulées par classes; ces fonctions sont généralement appelées méthodes. Lorsqu'une méthode est appelée sur un objet (par exemple une instance d'une classe), elle a intrinsèquement accès à l'état de cet objet. Ainsi, dans votre exemple, strip sait déjà sur quelle chaîne il est appelé, et ne nécessite donc aucun argument supplémentaire. Chaque fois que votre fonction opère naturellement sur un objet particulier ou un ensemble de données (par exemple, comme strip agit sur une chaîne), il est judicieux de la définir comme une méthode d'instance de cette manière.

En programmation procédurale, les fonctions sont définies indépendamment des structures de données (classes), et doivent recevoir explicitement les données avec lesquelles elles doivent travailler. Parfois, cette approche est en fait plus naturelle; par exemple, une fonction print qui imprime une entrée à stdout, ou similaire, n'est pas naturellement associée à un objet ou à des données particuliers.

La plupart des langages modernes intègrent des fonctions OO, car c'est un paradigme de programmation très polyvalent et puissant. Des langages comme Java et C# encouragent tout le code à être écrit dans un style orienté objet. Dans ces langues, même les types de données de base comme les chaînes et les points flottants sont en fait des objets et ont leurs propres méthodes et états. Cela est particulièrement vrai en C#, où tous les types héritent finalement de System.Object (même int et double) et héritent de toutes les méthodes communes définies par ce dernier. C'est ce qu'on appelle une hiérarchie de type unifié . PHP, d'autre part, a un curieux mélange de POO et de caractéristiques procédurales; il a commencé sa vie comme un langage procédural, et la POO n'a été introduite que dans la version 3 (et seulement dans un sens très rudimentaire). Bien que PHP5 ait une prise en charge de la POO relativement bonne, la plus grande partie de sa bibliothèque standard est toujours implémentée de manière procédurale sous la forme de collections de fonctions qui s'attendent à ce que l'état/données pertinent leur soit transmis en tant qu'arguments.Les bibliothèques de POO deviennent de plus en plus courantes (par exemple avec mysqli).

+0

Merci beaucoup pour l'explication détaillée. Mais une question cependant, dans la programmation procédurale, comment exactement les fonctions sont-elles organisées? Puisqu'ils ne sont pas rattachés à des classes, sont-ils regroupés en modules ou sont-ils simplement définis globalement? Merci encore. – maru

+4

Dépend de la langue. En PHP, ils sont tous définis dans l'espace de noms global par défaut (en effet, jusqu'à la version 5.3, PHP n'avait * * que * l'espace de noms global). Cependant, dans Python, par exemple, chaque module a son propre espace de noms (bien que certaines fonctions spéciales existent dans l'espace de noms global). –

+0

Cela a éclairci quelques confusions pour moi, merci encore! – maru

2

Vous regardez, essentiellement, la différence entre les méthodes d'instance et les méthodes class/static. Les méthodes d'instance sont appelées sur une instance spécifique d'une classe et ont accès à l'état interne de cette instance. Les méthodes class/static ne le sont pas et ne le font pas.


Je ne suis pas sûr de ce que vous cherchez en demandant "comment cela fonctionne pour PHP et ... Java." En ce qui concerne les méthodes par opposition aux méthodes sans instance, Ruby, PHP et Java fonctionnent tous à peu près de la même manière.

+0

Je veux dire, comment je peux l'utiliser en l'appelant directement comme trim() et pas comme le format Class.method? – maru

+1

Parce que PHP - contrairement, disons, à Java - ne demande pas que les fonctions soient liées à une classe, elle ne fait qu'allouer cela. En d'autres termes: c'est simplement la façon dont le langage est conçu. Python fonctionne de manière similaire; Les fonctions peuvent, mais ne sont pas obligées d'être, liées à des classes ou des instances d'une classe. –

Questions connexes