Fonctionnalités cachées de PHP? [fermé]


174

Je sais que cela ressemble à une question pointilleuse, mais laissez-moi vous expliquer d'où je viens.

À la sortie de l'université, j'ai trouvé un emploi dans une boutique PHP. J'y ai travaillé pendant un an et demi et j'ai pensé que j'avais appris tout ce qu'il y avait à apprendre sur la programmation.

Ensuite, j'ai trouvé un emploi en tant qu'atelier de développement interne individuel dans une grande entreprise où tout le travail était en C #. Dans mon engagement à ce poste, j'ai commencé à lire une tonne de blogs et de livres et j'ai rapidement réalisé à quel point j'avais tort de penser que je savais tout. J'ai appris sur les tests unitaires, l'injection de dépendances et les modèles de décorateurs, le principe de conception du couplage lâche, la composition sur le débat sur l'héritage, et ainsi de suite et ainsi de suite. Inutile de dire que mon style de programmation a complètement changé l'année dernière.

Maintenant, je me retrouve à ramasser un projet php en train de coder pour la start-up d'un ami et je me sens complètement contraint par opposition à la programmation en C #. Cela me dérange vraiment que toutes les variables d'une portée de classe doivent être référencées en ajoutant «$ this->». Cela me dérange qu'aucun des IDE que j'ai essayés n'a une très bonne intelligence et que mes méthodes de tests unitaires SimpleTest doivent commencer par le mot «test». Cela me rend fou que le typage dynamique m'empêche de spécifier implicitement le type de paramètre qu'une méthode attend, et que vous devez écrire une instruction switch pour effectuer des surcharges de méthode. Je ne supporte pas que vous ne puissiez pas avoir d'espaces de noms imbriqués et que vous deviez utiliser l'opérateur :: pour appeler le constructeur de la classe de base.

Maintenant, je n'ai pas l'intention de lancer un débat PHP vs C #, mais ce que je veux dire, c'est que je suis sûr qu'il y a des fonctionnalités PHP que je ne connais pas ou que je ne connais pas encore utiliser correctement. Je suis installé dans mon univers C # et j'ai du mal à voir à l'extérieur du bol en verre.

Alors je demande, quelles sont vos fonctionnalités préférées de PHP? Que pouvez-vous y faire que vous ne pouvez pas ou qui sont plus difficiles dans les langages .Net?


Paradigme OO cassé? Pour moi, c'est la pire fonctionnalité «cachée» que vous découvrez.
knoopx

Ces fils sont plutôt amusants ... Parce que pour l'équipe je travaille avec "fonctionnalité cachée" est une phrase de code qui signifie "bug". Et vous savez quoi ... Parfois, découvrir une fonctionnalité cachée n'est pas forcément une bonne chose ...
Ganesh Shankar

@Ganesh one man's bug est une autre fonctionnalité cachée de l'homme ...
Xeoncross

Réponses:


328

Documentation . La documentation obtient mon vote. Je n'ai pas rencontré de documentation en ligne plus complète pour un langage de programmation - tout le reste que je dois rassembler à partir de divers sites Web et pages de manuel.


60
Je suis d'accord. Pouvoir taper www.php.net/function_name et obtenir une référence la plupart du temps est génial.
Allain Lalonde le

1
C'est une fonctionnalité intéressante de PHP, mais je ne l'appellerais pas vraiment caché ... Si vous avez déjà cherché des paramètres de méthode sur Google, etc., vous vous retrouveriez sur php.net.
John Bubriski

27
Je suis également d’accord. La meilleure chose à propos du manuel sont les commentaires des utilisateurs. J'ai rarement vu d'autres documentations en avoir. Ils peuvent contenir de véritables gemmes. Le seul inconvénient est que, à mon humble avis, ils ont été élagués un peu trop tôt.
Sander Marechal

3
@Phoexo "un peu moins lisible" ??? Je n'ai jamais compris et ne comprendrai jamais MSDN, alors que les documents PHP sont simples et clairs.
lauriys

3
Être en désaccord. La seule raison pour laquelle la documentation est «bonne» est que certains des commentaires des utilisateurs bouchent tous les trous dans les notes officielles.
Rob Howard

179

Tableaux . À en juger par les réponses à cette question, je ne pense pas que les gens apprécient pleinement à quel point les tableaux en PHP sont faciles et utiles. Les tableaux PHP agissent en même temps comme des listes, des cartes, des piles et des structures de données génériques. Les tableaux sont implémentés dans le cœur du langage et sont utilisés partout, ce qui se traduit par une bonne localisation du cache du processeur. Perl et Python utilisent tous deux des constructions de langage distinctes pour les listes et les cartes, ce qui entraîne davantage de copies et des transformations potentiellement déroutantes.


11
Les éléments du tableau PHP sont ordonnés.
user8134

117
Mon passage initial de PHP à C # m'a presque tué. En C #, les tableaux ne sont qu'une simple structure avec une taille statique et un index numérique. En PHP, les tableaux sont le ruban adhésif de l'univers!
Dinah

4
Je suis également d’accord. Lorsque je jouais avec Java pour une mission Uni, j'étais stupéfait de voir à quel point ils étaient rigides, aucune flexibilité du tout. M'a vraiment fait apprécier à quel point les tableaux PHP sont bons.
Christian

11
Je suis sûr que les tableaux php sont excellents, mais 40 votes pour le commentaire qui frappe les tableaux C #? Si un tableau C # ne répond pas aux besoins, il existe de nombreuses options. ArrayList et les collections génériques sont tous deux très puissants. Il existe de nombreux types de collections pour des besoins spécifiques. Le seul avantage réel de php à cet égard est qu'il ne fournit aucune option à partir de laquelle un programmeur doit décider. Soit vous utilisez un tableau, soit vous n'avez pas de variable indexable.
G-Wiz

24
D'un autre côté, la syntaxe des tableaux est complètement nul. Dans de nombreux langages de script , vous pouvez créer un simple tableau 2D comme ceci: [[1, 2], [3, 4]], comparer à la version PHP: array(array(1, 2), array(3, 4)).
Rene Saarsoo le

167

Les gestionnaires de flux vous permettent d'étendre le "FileSystem" avec une logique qui, pour autant que je sache, est assez difficile à faire dans la plupart des autres langages.

Par exemple, avec le gestionnaire de flux MS-Excel, vous pouvez créer un fichier MS Excel de la manière suivante:

$fp = fopen("xlsfile://tmp/test.xls", "wb");
if (!is_resource($fp)) { 
    die("Cannot open excel file");
}

$data= array(
    array("Name" => "Bob Loblaw", "Age" => 50),  
    array("Name" => "Popo Jijo", "Age" => 75),  
    array("Name" => "Tiny Tim", "Age" => 90)
); 

fwrite($fp, serialize($data));
fclose($fp);

Je pense que le framework KIO vous permet également de faire cela, mais ce n'est disponible que pour les applications de bureau basées sur KDE.
MiffTheFox

21
IMHO ayant une bonne approche OO serait beaucoup plus raisonnable que ce désordre avec les gestionnaires de flux. Oui, c'est mignon de pouvoir lire / écrire des fichiers Excel, mais est-ce que ça doit fonctionner comme ça?
Anti Veeranna

3
Peut-être que oui, mais cette approche encapsule la complexité dans une interface commune à la plupart des développeurs PHP ... sans les obliger à apprendre des concepts orientés objet qui pourraient les dépasser.
Allain Lalonde

13
Si vous travaillez avec Amazon S3, consultez Zend_Amazon_S3, qui fournit une interface de flux pour les URL telles que «s3: // {bucket-name} / path».
davidtbernal

J'ai utilisé cela pour créer un DSL simple pour ma couche de vue en lisant simplement le fichier PHP, en remplaçant une chaîne et en le passant par eval (). Par exemple, je l'ai fait de telle sorte que je puisse utiliser des balises courtes chaque fois que je veux et faire @ -> someVar afin que je puisse accéder aux données au niveau de la vue.
Jasper Bekkers

131

Les méthodes magiques sont des méthodes de secours qui sont appelées chaque fois que vous invoquez une méthode qui n'existe pas ou que vous attribuez ou lisez une propriété qui n'existe pas, entre autres.

interface AllMagicMethods {
    // accessing undefined or invisible (e.g. private) properties
    public function __get($fieldName);
    public function __set($fieldName, $value);
    public function __isset($fieldName);
    public function __unset($fieldName);

    // calling undefined or invisible (e.g. private) methods
    public function __call($funcName, $args);
    public static function __callStatic($funcName, $args); // as of PHP 5.3

    // on serialize() / unserialize()
    public function __sleep();
    public function __wakeup();

    // conversion to string (e.g. with (string) $obj, echo $obj, strlen($obj), ...)
    public function __toString();

    // calling the object like a function (e.g. $obj($arg, $arg2))
    public function __invoke($arguments, $...);

    // called on var_export()
    public static function __set_state($array);
}

Un développeur C ++ ici pourrait remarquer que PHP permet de surcharger certains opérateurs, par exemple ()ou (string). En fait, PHP permet encore plus de surcharger, par exemple l' []opérateur ( ArrayAccess ), la foreachconstruction du langage ( Iterator et IteratorAggregate ) et la countfonction ( Countable ).


4
Comme exemple utile de ce qui peut être réalisé avec des méthodes magiques, allez à phpcodetips.blogspot.com/2008/07/domain-model-validation.html
grom

6
Être en désaccord. C'est beaucoup plus faible que des installations similaires dans Smalltalk, Ruby & Python (et probablement il a été copié de l'un d'entre eux)
finnw

34
Le fait que l'implémentation PHP de cette fonctionnalité soit plus faible que ces autres langages ne la rend pas moins utile en PHP.
Allain Lalonde

2
__call()est génial dans les frameworks avec la carte domain.com/controller/method/
alex

7
Les méthodes magiques sont également lentes comme l'enfer. Utilisez-les avec précaution.
Alex Weinstein

95

La classe standard est un conteneur soigné. Je ne l'ai appris que récemment.

Au lieu d'utiliser un tableau pour contenir des attributs de serveur

$person = array();
$person['name'] = 'bob';
$person['age'] = 5;

Vous pouvez utiliser une classe standard

$person = new stdClass();
$person->name = 'bob';
$person->age = 5;

Ceci est particulièrement utile lors de l'accès à ces variables dans une chaîne

$string = $person['name'] . ' is ' . $person['age'] . ' years old.';
// vs
$string = "$person->name is $person->age years old.";

43
«{$ person ['name']} a {$ person ['age']} ans» fonctionne.
Kornel

27
"personne [nom] a $ personne [age] ans" fonctionnera également ... Pas de guillemets, pas d'accolades :)
majelbstoat

16
$ string = sprintf ("% s a% d ans.", $ personne ['nom'], $ personne ['âge']);
Daniel Sloof

60
Pendant que nous sommes sur le sujet: (objet) array ("name" => 'bob', 'age' => 5)
Annika Backstrom

30
@majelbstoat: Supprimer les guillemets ralentirait le script car l'interpréteur PHP cherchera si 'nom' et 'âge' ont été définis avec define (...). C'est aussi une mauvaise pratique étant donné qu'il serait possible de retourner totalement les touches auxquelles on accède dans chaque cas: define ('age', 'name'); define ('nom', 'âge');
brianreavis le

90

Les fichiers d'inclusion peuvent avoir une valeur de retour que vous pouvez affecter à une variable.

// config.php
return array(
    'db' => array(
        'host' => 'example.org',
        'user' => 'usr',
        // ...
    ),
    // ...
);

// index.php
$config = include 'config.php';
echo $config['db']['host']; // example.org

@Peter TRÈS utile pour la gestion des erreurs d'exception db-> localhost.
Talvi Watia le

C'est pratique pour configurer un fichier de configuration rapide et sale.
Frank Farmer

Pourquoi renvoyez-vous ce tableau? Si un fichier inclus contient un tableau, il est immédiatement utilisable à l'inclusion.
fabrik

5
@fabrik car ce serait une variable globale et disponible dans toute la portée principale. C'est assez désagréable, c'est bien mieux.
Mikulas Dite

J'ai travaillé sur un projet dans le cadre Yii et ce projet a un fichier de configuration dans lequel le tableau a été retourné comme ça, maintenant je comprends pourquoi le fichier était comme ça.
Simer Twilio Toronto developer

83

Vous pouvez profiter du fait que l' oropérateur a une priorité plus faible que =pour faire ceci:

$page = (int) @$_GET['page'] 
  or $page = 1;

Si la valeur de la première affectation est évaluée à true, la deuxième affectation est ignorée. Un autre exemple:

$record = get_record($id) 
  or throw new Exception("...");

7
Je ne suis pas tout à fait convaincu de cela, je pense; même si cela ne semble pas être sujet aux erreurs, c'est contre-intuitif, et cela en soi peut favoriser les erreurs.
thomasrutter

14
@Pies: pour être honnête, le code suivant est assez compliqué: $ page = isset ($ _ GET ['page'])? (int) $ _ GET ['page']: 1; // L'avantage de ceci est qu'aucune suppression d'erreur n'est requise.
DisgruntledGoat

3
à la réflexion, puisque vous recherchez un entier que vous pourriez utiliser à la place: $ page = is_int ($ _ GET ['page'])? $ _GET ['page']: 1;
DisgruntledGoat

4
Il convient de noter que le code après ors'exécutera si le code avant oraboutit à la valeur numérique 0. Donc, sémantiquement, cela peut être moins probable avec quelque chose comme $_GET['page'], mais évidemment, les circonstances peuvent survenir et il est bon de faire attention.
absence de paupières

3
Il est également intéressant de noter que l' oropérateur est une version antérieure inférieure de l' ||opérateur. De plus, +1 parce que c'est très expressif et j'oublie souvent que c'est possible. Il devrait être utilisé plus souvent, et ce qu'il fait est absolument clair. Je ne sais pas comment codent les «vrais hommes», donc je ne peux pas faire de commentaire à ce sujet.
paupière

80

__autoload()(classe-) fichiers aidés par set_include_path().

En PHP5, il est désormais inutile de spécifier de longues listes d'instructions "include_once" lorsque vous faites une POO décente.

Définissez simplement un petit ensemble de répertoires dans lequel les fichiers de bibliothèque de classes sont correctement structurés et définissez le chemin d'inclusion automatique:

set_include_path(get_include_path() . PATH_SEPARATOR . '../libs/');`

Maintenant la __autoload()routine:

function __autoload($classname) {
    // every class is stored in a file "libs/classname.class.php"

    // note: temporary alter error_reporting to prevent WARNINGS
    // Do not suppress errors with a @ - syntax errors will fail silently!

    include_once($classname . '.class.php');
}

Désormais, PHP inclura automatiquement les fichiers nécessaires à la demande, économisant ainsi le temps d'analyse et la mémoire.


est-il préférable d'utiliser spl_autoload_register ()?
alex le

19
Bien sûr! __autoload () est PHP4 mais spl_autoload_register () est un "chaînage" non destructif de méthodes de chargement automatique.
Willem

3
Une fonctionnalité pratique, mais la seule mise en garde est que lorsque vous trouvez une instance d'une classe donnée, cela rend un peu plus difficile la recherche de l'emplacement d'un fichier de classe. La définition explicite des inclusions en haut vous donne une liste finie des classes impliquées et leur emplacement exact.
Cory House

C'est une fonctionnalité intéressante, mais uniquement pour contourner la situation de ne pas avoir de code précompilé, donc il ne sait pas où la classe va être. Le gros inconvénient est que vous ne pouvez pas avoir 2 classes avec le même nom, même si elles sont dans des espaces de noms différents.
Kibbee

3
Veuillez consulter la proposition PSR-0 du groupe de travail sur les normes PHP (avec les développeurs de ZF, Symfony, Doctrine, CakePHP, Solar, etc.) lors de la mise en œuvre du chargement automatique: groups.google.com/group/php-standards/web / psr-0-final-proposal
Philippe Gerber

76

Facilité . La plus grande caractéristique est la facilité avec laquelle les nouveaux développeurs peuvent s'asseoir et écrire des scripts «fonctionnels» et comprendre le code.

La pire caractéristique est la facilité avec laquelle les nouveaux développeurs peuvent s'asseoir et écrire des scripts «fonctionnels» et penser qu'ils comprennent le code.

L' ouverture de la communauté autour de PHP et les quantités massives de projets PHP disponibles en open-source sont beaucoup moins intimidantes pour quelqu'un qui entre dans le monde du développement et comme vous, peuvent être un tremplin vers des langages plus matures.

Je ne discuterai pas des choses techniques comme beaucoup avant moi, mais si vous considérez PHP comme une communauté plutôt qu'un langage Web, une communauté qui vous a clairement embrassé lorsque vous avez commencé à développer, les avantages parlent vraiment d'eux-mêmes.


3
Certainement un bon commentaire. Python était ma première langue et c'était génial, mais le manque de projets que je me sentais capable de comprendre a créé une barrière. Avec PHP, je peux rechercher à peu près tout sur la documentation et le comprendre ... les ressources disponibles sur le Web sont incroyables.
dscher

76

Variables et fonctions variables sans aucun doute!

$foo = 'bar';
$bar = 'foobar';
echo $$foo;    //This outputs foobar

function bar() {
    echo 'Hello world!';
}

function foobar() {
    echo 'What a wonderful world!';
}
$foo();    //This outputs Hello world!
$$foo();    //This outputs What a wonderful world!

Le même concept s'applique aux paramètres d'objet ($ some_object -> $ some_variable);

Très très gentil. Rendez le codage avec des boucles et des modèles très facile, et c'est plus rapide et plus sous contrôle que eval (Thanx @Ross & @Joshi Spawnbrood!).


111
les variables variables rendent en fait le code moins lisible et plus sujet aux erreurs.
Elzo Valugi le

8
Et les gens l'utilisent vraiment? Mec, je détesterais lire ces sources.
Gary Willoughby le

27
Les variables variables sont l'une des pires fonctionnalités offertes par PHP.
davidtbernal

10
9 Sur 10 fois, les variables variables sont mieux remplacées par des tableaux afin que vous ayez toutes les données en un seul endroit, vous pouvez les parcourir et cetera. Ce n'est que dans certaines circonstances très spécifiques qu'elles peuvent être utiles.
Jasper Bekkers

7
Veuillez ne pas faire utiliser cette "fonctionnalité" aux débutants.
whiskeysierra

68

Vous pouvez utiliser des fonctions avec un nombre d'arguments indéfini à l'aide de func_get_args().

<?php

function test() {

    $args = func_get_args();
    echo $args[2]; // will print 'd'
    echo $args[1]; // will print 3
}

test(1,3,'d',4);

?>

1
J'étais sur le point de publier ceci. Un peu comme la propriété arguments dans les fonctions JS.
alex le

67

J'adore les fichiers distants . Pour le développement Web, ce type de fonctionnalité est extrêmement utile.

Besoin de travailler avec le contenu d'une page Web? Un simple

$fp = fopen('http://example.com');

et vous avez un descripteur de fichier prêt à l'emploi, comme n'importe quel autre fichier normal.

Ou que diriez-vous de lire un fichier distant ou une page Web directement dans une chaîne?

$str = file_get_contents('http://example.com/file');

L'utilité de cette méthode particulière est difficile à surestimer.

Vous souhaitez analyser une image distante? Que diriez-vous de le faire via FTP?

$imageInfo = getimagesize('ftp://user:password@ftp.example.com/image/name.jpg');

Presque toutes les fonctions PHP qui fonctionnent avec des fichiers peuvent fonctionner avec un fichier distant. Vous pouvez même include()ou les require()fichiers de code à distance de cette façon.


2
C'est si gentil! Pour ce faire, par exemple en Java, vous devez inclure un milliard de fichiers jar et ensuite écrire beaucoup de code standard.
Kimble

16
"Vous pouvez même inclure () ou require () des fichiers de code à distance de cette façon." Bien sûr, inclure () un fichier sur un serveur que vous ne contrôlez pas est une idée terrible et terrible.
Frank Farmer

4
@Frank - oui, eh bien, on pourrait présumer que vous inclurons le code d'un serveur que vous avez le contrôle.
zombat

1
En fait, l'inclusion de fichiers distants est un problème de sécurité PHP courant: en.wikipedia.org/wiki/Remote_File_Inclusion#PHP .
Frank Farmer

63

strtr ()

C'est extrêmement rapide, à tel point que vous seriez surpris. En interne, il utilise probablement une structure de type b-tree folle pour organiser vos correspondances par leurs préfixes communs. Je l'utilise avec plus de 200 chaînes de recherche et de remplacement et il passe toujours par 1 Mo en moins de 100 ms. Pour toutes les chaînes, sauf pour des petites chaînes, strtr () est encore beaucoup plus rapide que strtolower () pour faire exactement la même chose, même en tenant compte du jeu de caractères. Vous pourriez probablement écrire un analyseur entier en utilisant des appels strtr successifs et ce serait plus rapide que la correspondance habituelle des expressions régulières, déterminer le type de jeton, générer tel ou tel autre type d'expression régulière.

J'écrivais un normalisateur de texte pour diviser le texte en mots, en minuscules, en supprimant la ponctuation, etc. et strtr était mon couteau suisse, il a battu le pantalon des expressions régulières ou même str_replace ().


1
C'est probablement plus rapide car il remplace un seul personnage.
staticsan

10
strtr () ne se contente pas de remplacer un seul caractère. Il peut remplacer des sous-chaînes de longueur arbitraire par d'autres sous-chaînes de longueur arbitraire, et cela semble toujours très rapide.
thomasrutter

1
Vous avez mentionné qu'il était plus rapide que strtolower dans certains cas, pouvez-vous le prouver? J'ai fait un petit benchmark et j'ai trouvé que c'était faux.
The Pixel Developer

1
J'ai trouvé que sur de petites chaînes de 80 caractères, par exemple, c'était plus lent que strtolower, et sur de grandes chaînes de 1 Mo par exemple, c'était plus rapide. Il y a probablement des frais généraux de type coût fixe chaque fois qu'il est appelé. J'utilisais simplement strtr ($ this-> string, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); La chaîne sur laquelle je travaillais était un texte anglais typique ("The quick brown fox", ce genre de chose).
thomasrutter

Je viens de lire cet article, puis j'ai fait une recherche sur Google et j'ai trouvé: simplemachines.org/community/index.php?topic=175031.0 Une idée de laquelle est la bonne?
Flipper le

61

Une fonctionnalité moins connue de PHP est extract()une fonction qui décompresse un tableau associatif dans l'espace de noms local. Cela existe probablement pour l'abormination autoglobale mais est très utile pour la création de modèles:

function render_template($template_name, $context, $as_string=false)
{
    extract($context);
    if ($as_string)
        ob_start();
    include TEMPLATE_DIR . '/' . $template_name;
    if ($as_string)
        return ob_get_clean();
}

Maintenant, vous pouvez utiliser render_template('index.html', array('foo' => 'bar'))et uniquement $fooavec la valeur "bar"apparaît dans le modèle.


15
J'allais me fâcher contre vous pour avoir suggéré qu'extrait () était en quelque sorte une bonne fonctionnalité. Mais je suppose que son utilisation est assez pratique. Je suppose que c'est la seule fois où je l'ai vu utilisé là où c'est une bonne idée!
thomasrutter

5
extract () simplifie grandement le déploiement de votre propre système de création de modèles extrêmement léger. +1
Dinah

14
Son inverse, compact (), est également bien: $ a = 1; $ b = 2; compact ("a", "b"); // == array ('a' => $ a, 'b' => $ b)
Annika Backstrom

2
Oui, c'est probablement la seule très bonne utilisation d'extrait ().
staticsan

4
Je suggérerais de ne pas utiliser de mots courants comme noms d'argument de fonction dans ce cas, car le $ context à partir duquel vous extrayez () pourrait contenir des valeurs aux index «as_string» ou «template_name». Utiliser EXTR_SKIP est acceptable, mais déplace uniquement le problème ailleurs (c'est-à-dire que si le modèle attend une $ as_string, il obtiendra la valeur incorrecte.)
Michał Tatarynowicz

52

Range () n'est pas caché en soi, mais je vois encore beaucoup de gens itérer avec:

for ($i=0; $i < $x; $i++) { 
    // code...
}

quand ils pourraient utiliser:

foreach (range(0, 12) as $number) {
    // ...
}

Et vous pouvez faire des choses simples comme

foreach (range(date("Y"), date("Y")+20) as $i)
{
print "\t<option value=\"{$i}\">{$i}</option>\n";
}

3
vous pouvez faire foreach ($ array as $ key => $ value) {} ce qui est encore plus simple.
SilentGhost

15
Cela peut être une micro-optimisation, mais il convient de noter que pour et pendant sont beaucoup plus rapides et moins gourmands en mémoire que foreach.
JAL

3
Vous devriez essayer Python. C'est aussi simple que "for i in range (12)", ou vous pouvez utiliser le xrange plus efficace.
Ponkadoodle

2
@SilentGhost: vous auriez toujours besoin d'un tableau pour commencer, ce qui n'est pas toujours le cas. @Newbie: élaborer s'il vous plaît?
Alec le

1
@flexxy, à part ça, ce n'est PAS. Considérez ceci: phpbench.com faites défiler jusqu'à Read Loop.
Buddy

44

L'espace Web compatible PHP est généralement moins cher que quelque chose avec (asp) .net. Vous pourriez appeler cela une fonctionnalité ;-)


3
Il est également beaucoup moins coûteux de configurer plusieurs serveurs si vous n'avez pas à payer Windows Server sur chacun d'eux.
MiffTheFox

4
Le seul endroit que je connais où Windows est rentable est une université qui obtient des remises STEEEEP sur le logiciel serveur dans la mesure où il est moins cher pour mon service d'acheter 100 copies de Windows que de former nos administrateurs sur Linux (ce qui en partie me rend triste mais leur configuration de Windows est propre et bien configurée).
dcousineau

4
Pour l'instant, mais vous ne devez faire le changement qu'une seule fois, alors que vous devrez acheter de nouvelles licences tôt ou tard ...
e-satis

42

Le staticmot-clé est utile en dehors d'un point de vue POO. Vous pouvez rapidement et facilement implémenter la `` mémorisation '' ou la mise en cache de fonctions avec quelque chose d'aussi simple que:

<?php
function foo($arg1)
{
    static $cache;

    if( !isset($cache[md5($arg1)]) )
    {
        // Do the work here
        $cache[md5($arg1)] = $results;
    }

    return $cache[md5($arg1)];
}
?>

Le staticmot clé crée une variable qui persiste uniquement dans la portée de cette fonction après l'exécution. Cette technique est idéale pour les fonctions qui frappent la base de données comme get_all_books_by_id(...)ou get_all_categories(...)que vous appelleriez plus d'une fois pendant le chargement d'une page.

Attention: assurez-vous de trouver la meilleure façon de créer une clé pour votre hachage, dans à peu près toutes les circonstances, ce qui md5(...)précède n'est PAS une bonne décision (problèmes de vitesse et de longueur de sortie), je l'ai utilisé à des fins d'illustration. sprintf('%u', crc32(...))ou spl_object_hash(...)peut être beaucoup mieux selon le contexte.


7
Juste une fonctionnalité copiée de C / C ++
GetFree

2
@GetFree Je ne pense pas que quiconque nierait que presque tout PHP a été copié à partir de C, C ++, Perl, etc.
Frank Farmer

1
La copie est la meilleure chose à faire.
NikiC

1
Mauvais PHP. C'est toujours copier les fonctionnalités des autres. Il devrait tout écrire à partir de zéro à la place! (Au cas où la moindre possibilité serait prise au sérieux: je plaisante)
Halil Özgür

42

Une fonctionnalité intéressante de PHP est la CLI . Ce n'est pas si "promu" dans la documentation, mais si vous avez besoin de scripts / applications de console de routine, l'utilisation de cron + php cli est vraiment rapide à développer!


Je devrais regarder vraiment dans cela, j'ai plusieurs tâches cron qui vont chercher un script PHP parwget http://example.com...
DisgruntledGoat

La CLI est également un excellent moyen de déboguer ponctuellement, car les avertissements / erreurs s'afficheront sans que vous ayez à modifier vos préférences de rapport d'erreurs.
Glacials

40

Puis "et imprimez" le truc

<?php $flag and print "Blah" ?>

Fera écho Blah si $ flag est vrai. NE FONCTIONNE PAS AVEC ECHO.

Ceci est très pratique dans le modèle et remplace le? : ce ne sont pas vraiment faciles à lire.


24
Je trouve moi-même l'opérateur ternaire beaucoup plus évident que d'exploiter le court-circuit d'évaluation d'un et logique.
Vicent Marti

26
En fait, c'est le même nombre de caractères que <? Php if ($ flag) print "Blah"
trop de php

3
Les parenthèses ne sont pas aussi faciles à taper que "et", surtout sur mon clavier français sanglant ;-)
e-satis

7
@all comments - Il ne s'agit pas de savoir à quel point vous pouvez l'obtenir! Il s'agit de lisibilité et de facilité d'utilisation pour les personnes modèles, qui parfois ne sont même pas des programmeurs.
Tor Valamo

6
Je dirais que l'instruction if () est plus facile et plus lisible. Il est certainement plus facile pour moi de comprendre que d'exploiter essentiellement un effet secondaire de l'opérateur 'et' en PHP, où il est facile de faire une erreur (ou d'avoir l'air d'une erreur lorsque vous lirez le code plus tard). Par exemple, comme indiqué, cela ne fonctionnera pas comme vous le souhaitez avec «echo». Avec if (), il n'y a pas de pièges comme ça.
thomasrutter

37

Vous pouvez utiliser le caractère moins dans les noms de variables comme ceci:

class style
{
  ....
  function set_bg_colour($c)
  {
    $this->{'background-color'} = $c;
  }
}

Pourquoi l'utiliser? Aucune idée: peut-être pour un modèle CSS? Ou un JSON étrange que vous devez générer. C'est une caractéristique étrange :)


2
Cela fonctionne-t-il avec les noms de méthode? Pourrait être utile pour les frameworks qui utilisent un routeur et je veux domain.com/something-with-minuses/view/
alex

6
Les accolades vous permettent d'accéder aux propriétés des objets comportant des tirets, des points et d'autres entités non alphanumériques. Une des raisons de l'utiliser est lorsqu'il s'agit de xml, où les noms d'entités peuvent être pointés comme dans NITF / NewsML <body.content>. Si vous utilisez SimpleXML, vous y accéderiez comme ceci $item->DataContent->body->{'body.content'}.
Jesse Kochis

2
Les variables PHP peuvent prendre n'importe quel caractère lorsqu'elles sont utilisées de cette façon, même les espaces et les retours à la ligne.
Débutant le

Ce serait très utile lors de l'utilisation dans SimpleXML ... génial. Merci d'avoir partagé.
KyleFarris le

34

La syntaxe HEREDOC est ma fonction cachée préférée. Toujours difficile à trouver car vous ne pouvez pas Google pour <<< mais cela vous évite d'avoir à échapper de gros morceaux de HTML et vous permet toujours de déposer des variables dans le flux.

echo <<<EOM
  <div id="someblock">
    <img src="{$file}" />
  </div>
EOM;

2
HEREDOC est ma façon préférée de créer et d'utiliser des instructions SQL.
bdl

11
Remarque: la EOM de fermeture; ne peut pas être indenté.
micahwittman

Bien, mais inutile si vous utilisez des modèles. De plus, cela empêche une bonne indentation.
Manos Dilaverakis

7
Cher dieu, c'est le morceau de code le plus laid que j'aie jamais vu. Si vous utilisez HEREDOC, vous n'avez pas séparé la présentation de la logique.
Lotus Notes

@Byron: Vous n'êtes pas obligé de l'utiliser pour la présentation, il peut être utilisé pour n'importe quelle chaîne. Voir le commentaire de bdl.
Tom Pažourek

34

Peu de gens savent probablement qu'il est possible de spécifier des «variables» constantes comme valeurs par défaut pour les paramètres de fonction:

function myFunc($param1, $param2 = MY_CONST)
{
//code...
}

Les chaînes peuvent être utilisées comme s'il s'agissait de tableaux :

$str = 'hell o World';
echo $str; //outputs: "hell o World"

$str[0] = 'H';
echo $str; //outputs: "Hell o World"

$str[4] = null;
echo $str; //outputs: "Hello World"

3
Ce dernier est chouette. Bien que je ne sache pas quand ce serait mieux qu'une autre méthode pour supprimer un personnage. +1 nontheless
George Mauer

3
C'est probablement plus efficace que d'appeler une fonction pour le faire. Les chaînes sont normalement stockées de manière contiguë en mémoire, donc accéder à $ str [4] est trivial. Le stockage de chaînes sous forme de tableaux de caractères est commun à la plupart des langues dérivées de C.
sjobe

1
Vous n'êtes pas obligé d'utiliser une constante définie comme valeur par défaut. Ce qui suit est également parfaitement valide: function foot ($ param1, $ default = array ('key' => 'value'), $ default_s = 'String', $ default_i = 10, $ default_b = false). Cependant, vous avez raison de noter que vous ne pouvez pas utiliser une variable comme argument par défaut.
dcousineau

@dcousineau Votre exemple est parfaitement valable puisque array () n'est pas une fonction mais une construction de langage. Les appels de fonction ne sont pas autorisés comme valeurs par défaut pour les arguments.
Jamol

4
Soyez prudent en traitant les chaînes comme des tableaux si vous avez des chaînes multi-octets (langues étrangères, etc.)
philfreo

33

La chose la plus utile à propos du code PHP est que si je ne comprends pas très bien une fonction que je vois, je peux la rechercher en utilisant un navigateur et en tapant:

http://php.net/function

Le mois dernier, j'ai vu la fonction "range" dans un certain code. C'est l'une des centaines de fonctions que j'ai réussi à ne jamais utiliser mais qui s'est avérée vraiment utile:

http://php.net/range

Cette URL est un alias pour http://us2.php.net/manual/en/function.range.php . Cette idée simple, de mapper des fonctions et des mots-clés vers des URL , est géniale.

Je souhaite que d'autres langages, frameworks, bases de données, systèmes d'exploitation aient un mécanisme aussi simple pour rechercher de la documentation.


5
range()peut être utile pourforeach( range(1, 10) as $i) { };
alex

Si vous avez FireFox; il suffit de taper PHP functiondans la barre d'adresse, il effectuera une recherche Google `` J'ai de la chance '' et vous vous retrouverez presque toujours sur la bonne page de documentation php.
Kolky

30

Commentaires de bloc rapide

/*
    die('You shall not pass!');
//*/


//*
    die('You shall not pass!');
//*/

Ces commentaires vous permettent de basculer si un bloc de code est commenté avec un caractère.


14
Ce n'est pas vraiment spécifique à PHP. Cela fonctionne dans n'importe quelle langue prenant en charge les // ...commentaires de ligne et /* ... */les commentaires de blocage.
Jordan Ryan Moore

tous les utilitaires de nettoyage de code finissent par vous détester pour avoir utilisé ceci ...;)
Talvi Watia

3
J'ai aussi utilisé /** /avant et /**/après. Vous pouvez basculer le bloc en supprimant et en ajoutant l'espace dans le premier. Cela présente un avantage supplémentaire de travailler avec CSS (et d'autres langages qui ne prennent pas en charge les // ... commentaires).
kingjeffrey

FWIW, lien vers l'article original aleembawany.com/2009/01/27/lazy-block-comment-trick
aleemb

@aleemb, évitez d'apporter d'autres modifications à cette question.
Sam152

29

Ma liste… la plupart d'entre elles relèvent plus des «fonctionnalités cachées» que des «fonctionnalités préférées» (j'espère!), Et toutes ne sont pas utiles, mais… ouais.

// swap values. any number of vars works, obviously  
list($a, $b) = array($b, $a);

// nested list() calls "fill" variables from multidim arrays:  
$arr = array(  
  array('aaaa', 'bbb'),  
  array('cc', 'd')  
);  
list(list($a, $b), list($c, $d)) = $arr;  
echo "$a $b $c $d"; // -> aaaa bbb cc d  

// list() values to arrays  
while (list($arr1[], $arr2[], $arr3[]) = mysql_fetch_row($res)) { .. }  
// or get columns from a matrix  
foreach($data as $row) list($col_1[], $col_2[], $col_3[]) = $row;

// abusing the ternary operator to set other variables as a side effect:  
$foo = $condition ? 'Yes' . (($bar = 'right') && false) : 'No' . (($bar = 'left') && false);  
// boolean False cast to string for concatenation becomes an empty string ''.  
// you can also use list() but that's so boring ;-)  
list($foo, $bar) = $condition ? array('Yes', 'right') : array('No', 'left');

Vous pouvez également imbriquer des opérateurs ternaires, ce qui est parfois utile.

// the strings' "Complex syntax" allows for *weird* stuff.  
// given $i = 3, if $custom is true, set $foo to $P['size3'], else to $C['size3']:  
$foo = ${$custom?'P':'C'}['size'.$i];  
$foo = $custom?$P['size'.$i]:$C['size'.$i]; // does the same, but it's too long ;-)  
// similarly, splitting an array $all_rows into two arrays $data0 and $data1 based  
// on some field 'active' in the sub-arrays:  
foreach ($all_rows as $row) ${'data'.($row['active']?1:0)}[] = $row;

// slight adaption from another answer here, I had to try out what else you could  
// abuse as variable names.. turns out, way too much...  
$string = 'f.> <!-? o+';  
${$string} = 'asdfasf';  
echo ${$string}; // -> 'asdfasf'  
echo $GLOBALS['f.> <!-? o+']; // -> 'asdfasf'  
// (don't do this. srsly.)

${''} = 456;  
echo ${''}; // -> 456  
echo $GLOBALS['']; // -> 456  
// I have no idea.  

Bon, je vais m'arrêter pour l'instant :-)


Hmm, ça fait un moment ...

// just discovered you can comment the hell out of php:
$q/* snarf */=/* quux */$_GET/* foo */[/* bar */'q'/* bazz */]/* yadda */;

Donc, je viens de découvrir que vous pouvez passer n'importe quelle chaîne comme nom de méthode SI vous la placez entre accolades. Vous ne pouvez malheureusement pas définir de chaîne comme méthode, mais vous pouvez les attraper avec __call () et les traiter davantage si nécessaire. Hmmm ...

class foo {
  function __call($func, $args) {
    eval ($func);
  }
}

$x = new foo;
$x->{'foreach(range(1, 10) as $i) {echo $i."\n";}'}();

J'ai trouvé ce petit bijou dans les commentaires de Reddit:

$foo = 'abcde';
$strlen = 'strlen';
echo "$foo is {$strlen($foo)} characters long."; // "abcde is 5 characters long."

Vous ne pouvez pas appeler des fonctions à l'intérieur de {} directement comme ceci, mais vous pouvez utiliser des variables contenant le nom de la fonction et les appeler! (* et * vous pouvez également utiliser des variables variables dessus)


2
Veuillez ne pas abuser de l'opérateur de comparaison ternaire; cela conduit à une obfuscation du code.
staticsan

Sensationnel. Cela pourrait totalement arroser votre liste $ GLOBALS. Mauvaise pratique. Sérieusement.
Talvi Watia le

Existe-t-il encore un concours PHP obscurci?
Lotus Notes

Eh bien, truc avec swap - impressionnant et utile, merci.
OZ_

1
${''} = 456;hahaha .... tout à fait l'abus.
Skurmedel

26

Manipulation de tableau.
Des tonnes d'outils pour travailler et manipuler des tableaux. Ce n'est peut-être pas unique à PHP, mais je n'ai jamais travaillé avec un langage qui le rende aussi simple.


comme quoi par exemple? Il me semble que les fonctions sont toutes mal nommées et positionnées dans l'espace de noms global. De plus, je ne peux pas penser à quoi que ce soit qui ne soit pas aussi simple dans une autre langue, à l'exception peut-être de $ arr [] = $ newvalue pour ajouter des valeurs - c'est cool
George Mauer

8
Eh bien, le tableau PHP est une structure de données qui peut être utilisée facilement comme pile, file d'attente, deque, liste, table de hachage, etc. Il est en effet assez flexible pour les besoins les plus courants, sans recourir à autre chose que des fonctions array_ *.
Camilo Díaz Repka le

6
Python fait des tableaux (sous forme de listes et de tuples) bien mieux que PHP.
trop de php

26

Je suis un peu comme vous, j'ai codé PHP depuis plus de 8 ans. J'ai dû suivre un cours .NET / C # il y a environ un an et j'ai vraiment apprécié le langage C # (détesté ASP.NET) mais cela a fait de moi un meilleur développeur PHP.

PHP en tant que langage est assez pauvre, mais je suis extrêmement rapide avec lui et la pile LAMP est géniale. Le produit final dépasse de loin la somme des pièces.

Cela dit, en réponse à votre question:

http://uk.php.net/SPL

J'adore le SPL , la classe de collection en C # était quelque chose que j'ai aimé dès que j'ai commencé avec. Maintenant, je peux avoir mon gâteau et le manger.

Andrew


24

Je suis un peu surpris que personne ne l'ait encore mentionné, mais l'un de mes trucs préférés avec les tableaux utilise l'opérateur plus. C'est un peu comme array_merge()mais un peu plus simple. J'ai trouvé que c'est généralement ce que je veux. En effet, il prend toutes les entrées du RHS et les fait apparaître dans une copie du LHS, en les écrasant si nécessaire (c'est-à-dire non commutatif). Très utile pour commencer avec un tableau "par défaut" et ajouter des valeurs réelles en un seul coup, tout en laissant les valeurs par défaut en place pour les valeurs non fournies.

Exemple de code demandé:

// Set the normal defaults.
$control_defaults = array( 'type' => 'text', 'size' => 30 );

// ... many lines later ...

$control_5 = $control_defaults + array( 'name' => 'surname', 'size' => 40 );
// This is the same as:
// $control_5 = array( 'type' => 'text', 'name' => 'surname', 'size' => 40 );

$defaultsdevrait être$control_defaults
diEcho

3
Je pense que ce n'est pas aussi clair que array_merge lorsque vous avez beaucoup de code à maintenir. Au moins, lorsque vous utilisez la fonction array_merge, il est évident que vous avez affaire à des tableaux.
Sylvain

Et ce fait que vous faites ... + array( ...n'est pas suffisant pour le souligner? :-)
staticsan

De quelle version de PHP avez-vous besoin pour cela?
Lotus Notes

C'est une fonctionnalité intéressante et il convient de noter que le tableau sur le côté "droit" du "+" n'écrasera pas les clés existantes du tableau sur le côté "gauche" du "+".
Wil Moore III

21

En voici un, j'aime comment définir des valeurs par défaut sur des paramètres de fonction qui ne sont pas fournis est beaucoup plus facile:

function MyMethod($VarICareAbout, $VarIDontCareAbout = 'yippie') { }

4
Curieusement, j'ai vu cette "fonctionnalité cachée" dans Google Reader la semaine dernière. Je ne comprends pas ce qui est caché à ce sujet - c'est la syntaxe de base. Essayez if ($ var = true) par exemple.
Ross

8
Plus facile que quoi? La plupart des langues ont cette fonctionnalité.
Christian Davén

10
Plus facile que C # (et je pense que C ++ et Java)
George Mauer

8
C ++ prend en charge les valeurs de paramètre par défaut.
sjobe

2
c # ne prend pas du tout en charge les valeurs par défaut. vous devez écrire une fonction surchargée et toujours déclarer la valeur qui est tout simplement encombrante
DeveloperChris

21

Rapide et sale est la valeur par défaut.
Le langage est rempli de raccourcis utiles, ce qui fait de PHP le candidat idéal pour les (petits) projets qui ont un court délai de mise sur le marché. Non pas qu'un code PHP propre soit impossible, cela demande juste un effort et une expérience supplémentaires.

Mais j'aime PHP parce qu'il me permet d'exprimer ce que je veux sans taper un essai.

PHP:

if (preg_match("/cat/","one cat")) {
   // do something
}

JAVA:

import java.util.regex.*;
Pattern p = Pattern.compile("cat");
Matcher m = p.matcher("one cat")
if (m.find()) {
  // do something
}

Et oui, cela inclut de ne pas taper Int .


4
vous devriez utiliser des strpos à la place: if (false! == strpos ("one cat", "cat")) {
OIS

17
@OIS, le but de son exemple était d'illustrer et de comparer le déroulement d'une correspondance rapide de regex, pas comment trouver la chaîne "cat" dans "one cat".
dcousineau

19
Java: if (Pattern.matches ("cat", "one cat")) {// faire quelque chose} Arrêtez de vous plaindre de java si vous ne le savez pas.
whiskeysierra

3
+1 Willi comment faites-vous preg_replace ('/ ([<[]! - \ s *) (\ S *?) (\ S * - [>]]?) / Se', "\ $ this- > Choisissez ('\\ 1', '\\ 2', '\\ 3', \ $ data) ", $ text); à Java? Cela trouve un commentaire dans le texte d'entrée, puis appelle une fonction avec les éléments correspondants qui dans ce cas $ this-> choose (...) décide par quoi remplacer la correspondance et renvoie les résultats.
DeveloperChris

1
Regex est que PHP est assez merdique ... Je préfère de loin avoir un Regex de style Perl ou JavaScript où le //est intégré au langage.
cdmckay
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.