variable valor pasar obtener llamar embebido desde dentro con como combinar php hidden-features

valor - Características ocultas de PHP



valor de html a php (30)

Comentarios rápidos de bloque

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

Estos comentarios le permiten alternar si se comenta un bloque de código con un carácter.

Sé que esto suena como una pregunta de putas, pero déjenme explicar de dónde vengo.

De la universidad conseguí un trabajo en una tienda de PHP. Trabajé allí durante un año y medio y pensé que había aprendido todo lo que había para aprender sobre programación.

Luego conseguí un trabajo como tienda de desarrollo interno para un solo hombre en una corporación importante donde todo el trabajo estaba en C #. En mi compromiso con el puesto comencé a leer un montón de blogs y libros y rápidamente me di cuenta de lo equivocado que estaba al pensar que lo sabía todo. Aprendí sobre pruebas unitarias, patrones de inyección de dependencia y decorador, el principio de diseño de acoplamiento flexible, la composición sobre el debate de herencia, y así sucesivamente, todavía estoy absorbiéndolo todo. Huelga decir que mi estilo de programación ha cambiado por completo en el último año.

Ahora me encuentro recogiendo un proyecto de php que codifica la puesta en marcha de un amigo y me siento completamente limitado en comparación con la programación en C #. Realmente me molesta que todas las variables en un alcance de clase tengan que referirse al anexar ''$ this->''. Me molesta que ninguno de los IDEs que probé tenga muy buena inteligencia y que los métodos de prueba de mi unidad SimpleTest tengan que comenzar con la palabra ''prueba''. Me vuelve loco que el tipado dinámico me impida especificar de manera implícita qué tipo de parámetro espera un método, y que debe escribir una declaración de conmutación para hacer sobrecargas de métodos. No puedo soportar que no puedas anidar espacios de nombres y que tengas que usar el operador :: para llamar al constructor de la clase base.

Ahora no tengo intención de comenzar un debate entre PHP vs. C #, más bien lo que quiero decir es que estoy seguro de que hay algunas características de PHP que no conozco ni conozco pero que no uso correctamente. Estoy en mi universo de C # y tengo problemas para ver fuera del recipiente de vidrio.

Así que estoy preguntando, ¿cuáles son tus características favoritas de PHP? ¿Qué cosas puede hacer en ellas que no puede o son más difíciles en los lenguajes .Net?


La clase estándar es un contenedor ordenado. Solo me enteré hace poco.

En lugar de usar una matriz para mantener los atributos serveral

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

Puedes usar una clase estándar

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

Esto es particularmente útil cuando se accede a estas variables en una cadena

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


La palabra clave static es útil fuera del punto de vista OOP. Puede implementar rápida y fácilmente ''memoization'' o función de almacenamiento en caché con algo tan simple como:

<?php function foo($arg1) { static $cache; if( !isset($cache[md5($arg1)]) ) { // Do the work here $cache[md5($arg1)] = $results; } return $cache[md5($arg1)]; } ?>

La palabra clave static crea una variable que persiste solo dentro del alcance de esa función después de la ejecución. Esta técnica es ideal para funciones que golpean la base de datos como get_all_books_by_id(...) o get_all_categories(...) que llamarías más de una vez durante la carga de una página.

Advertencia: Asegúrate de encontrar la mejor manera de hacer una clave para tu hash, en casi todas las circunstancias el md5(...) anterior NO es una buena decisión (problemas de velocidad y de longitud de salida), lo usé con fines ilustrativos . sprintf(''%u'', crc32(...)) o spl_object_hash(...) pueden ser mucho mejores según el contexto.


Lo más útil sobre el código PHP es que si no entiendo muy bien una función, veo que puedo buscarla usando un navegador y escribiendo:

http://php.net/function

El mes pasado vi la función "rango" en algún código. Es una de las cientos de funciones que había logrado nunca usar pero que resultan realmente útiles:

http://php.net/range

Esa url es un alias para http://us2.php.net/manual/en/function.range.php . Esa idea simple, de funciones de mapeo y palabras clave para las urls , es increíble.

Deseo que otros lenguajes, marcos, bases de datos, sistemas operativos tengan un mecanismo tan simple para buscar documentación.


Me encantan los archivos remotos . Para el desarrollo web, este tipo de característica es excepcionalmente útil.

¿Necesitas trabajar con los contenidos de una página web? Un simple

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

y tiene un archivo manipular listo para funcionar, al igual que cualquier otro archivo normal.

¿O qué tal leer un archivo remoto o una página web directamente en una cadena?

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

La utilidad de este método particular es difícil de exagerar.

¿Quieres analizar una imagen remota? ¿Qué hay de hacerlo a través de FTP?

$imageInfo = getimagesize(''ftp://user:[email protected]/image/name.jpg'');

Casi cualquier función de PHP que funcione con archivos puede funcionar con un archivo remoto. Incluso puede include() o require() archivos de código de forma remota de esta manera.


Mi lista ... la mayoría caen más bajo las "características ocultas" que las "características favoritas" (¡espero!), Y no todas son útiles, pero ... sí.

// 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'');

You can nest ternary operators too, comes in handy sometimes.

// 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.

Right, I''ll stop for now :-)

Hmm, it''s been a while..

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

So, just discovered you can pass any string as a method name IF you enclose it with curly brackets. You can''t define any string as a method alas, but you can catch them with __call(), and process them further as needed. Hmmm....

class foo { function __call($func, $args) { eval ($func); } } $x = new foo; $x->{''foreach(range(1, 10) as $i) {echo $i."/n";}''}();

Found this little gem in Reddit comments:

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

You can''t call functions inside {} directly like this, but you can use variables-holding-the-function-name and call those! (*and* you can use variable variables on it, too)


Probablemente, no muchos saben que es posible especificar "variables" constantes como valores por defecto para los parámetros de función:

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

Las cadenas se pueden usar como si fueran matrices :

$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"


Puede aprovechar el hecho de que el operador or tiene una prioridad menor que = para hacer esto:

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

Si el valor de la primera asignación se evalúa como true , la segunda asignación se ignora. Otro ejemplo:

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


Puede usar funciones con un número indefinido de argumentos usando 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); ?>


Puede usar el carácter menos en nombres de variable como este:

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

¿Por qué usarlo? No tengo idea: ¿tal vez para un modelo de CSS? O algún JSON extraño que necesites. Es una característica extraña :)


Una buena característica de PHP es la CLI . No está tan "promocionado" en la documentación, pero si necesita scripts de rutina / aplicaciones de consola, ¡el uso de cron + php cli es realmente rápido de desarrollar!


Una característica no tan conocida de PHP es extract() , una función que descomprime una matriz asociativa en el espacio de nombres local. Esto probablemente exista para la iniciación autoglobal, pero es muy útil para la creación de plantillas:

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(); }

Ahora puede usar render_template(''index.html'', array(''foo'' => ''bar'')) y solo $foo con el valor "bar" aparece en la plantilla.


strtr()

Es extremadamente rápido, tanto que te sorprendería. Internamente, probablemente use alguna estructura de tipo b-tree loca para organizar sus coincidencias por sus prefijos comunes. Lo uso con más de 200 cadenas de búsqueda y reemplazo y todavía va a través de 1 MB en menos de 100 ms. Para todas las cadenas menos triviales, strtr () es incluso significativamente más rápido que strtolower () al hacer exactamente lo mismo, incluso teniendo en cuenta el conjunto de caracteres. Probablemente puedas escribir un analizador completo usando llamadas strtr sucesivas y sería más rápido que la coincidencia habitual de expresión regular, averiguar el tipo de token, publicar esto o aquello, el siguiente tipo de expresión regular.

Escribía un texto normalizador para dividir el texto en palabras, minúsculas, eliminar la puntuación, etc. y strtr era mi navaja suiza, le quitaba los pantalones a las expresiones regulares o incluso str_replace ().


__autoload() (class-) archivos ayudados por set_include_path() .

En PHP5, ahora no es necesario especificar largas listas de sentencias "include_once" cuando se realiza un OOP decente.

Simplemente defina un pequeño conjunto de directorio en el que los archivos de la biblioteca de clases estén estructurados de manera sana y establezca la ruta de inclusión automática:

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

Ahora la rutina __autoload() :

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''); }

Ahora PHP automáticamente incluirá los archivos necesarios bajo demanda, conservando el tiempo de análisis y la memoria.


¡Variables y funciones variables sin lugar a dudas!

$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!

El mismo concepto se aplica a los parámetros del objeto ($ some_object -> $ some_variable);

Muy, muy agradable. Hacer la codificación con bucles y patrones es muy fácil, y es más rápido y está más bajo control que eval (Thanx @Ross & @Joshi Spawnbrood!). T


Range() no está oculto per se, pero todavía veo mucha gente iterando con:

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

cuando podrían estar usando:

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

Y puedes hacer cosas simples como

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


Los métodos mágicos son métodos alternativos que se invocan cada vez que se invoca un método que no existe o se asigna o lee una propiedad que no existe, entre otras cosas.

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 desarrollador de C ++ aquí podría notar que PHP permite sobrecargar algunos operadores, por ejemplo, () o (string) . En realidad, PHP permite sobrecargar aún más, por ejemplo, el operador [] ( ArrayAccess ), el constructo de lenguaje foreach ( Iterator e IteratorAggregate ) y la función de count ( Countable ).


Array manipulation.
Tons of tools for working with and manipulating arrays. It may not be unique to PHP, but I''ve never worked with a language that made it so easy.


Arrays . A juzgar por las respuestas a esta pregunta, no creo que la gente aprecie plenamente cuán fáciles y útiles son las matrices en PHP. Las matrices PHP actúan como listas, mapas, pilas y estructuras de datos genéricas, todo al mismo tiempo. Las matrices se implementan en el núcleo del lenguaje y se utilizan en todas partes, lo que da como resultado una buena ubicación de caché de la CPU. Tanto Perl como Python usan constructos de lenguaje separados para listas y mapas que resultan en más copias y transformaciones potencialmente confusas.


Documentación . La documentation obtiene mi voto. No he encontrado una documentación en línea más completa para un lenguaje de programación, todo lo demás que tengo que juntar de varios sitios web y páginas de manual.


El espacio web habilitado para PHP suele ser menos costoso que algo con (asp) .net. Puede llamar a eso una característica ;-)


Facilidad La mejor característica es lo fácil que es para los nuevos desarrolladores sentarse y escribir scripts "que funcionen" y comprender el código.

La peor característica es lo fácil que es para los nuevos desarrolladores sentarse y escribir scripts "que funcionen" y pensar que entienden el código.

La apertura de la comunidad en torno a PHP y la gran cantidad de proyectos PHP disponibles como de código abierto es mucho menos intimidante para alguien que ingresa al mundo del desarrollo y, como usted, puede ser un trampolín hacia idiomas más maduros.

No voy a debatir sobre los aspectos técnicos como muchos antes que yo, pero si miras PHP como una comunidad en lugar de un lenguaje web, una comunidad que claramente te abrazó cuando comenzaste a desarrollar, los beneficios realmente hablan por sí mismos.


Incluir archivos puede tener un valor de retorno que puede asignar a una variable.

// config.php return array( ''db'' => array( ''host'' => ''example.org'', ''user'' => ''usr'', // ... ), // ... ); // index.php $config = include ''config.php''; echo $config[''db''][''host'']; // example.org


La sintaxis HEREDOC es mi función oculta favorita. Siempre es difícil de encontrar, ya que no puedes buscar <<< en Google, pero te impide tener que escapar de grandes porciones de HTML y aún así puedes dejar caer variables en la transmisión.

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


Luego truco "e imprimir"

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

Se hará eco de Blah si $ flag es verdadero. NO TRABAJA CON ECHO.

Esto es muy útil en la plantilla y reemplaza el? : que no son realmente fáciles de leer


Quick and dirty is the default.
The language is filled with useful shortcuts, This makes PHP the perfect candidate for (small) projects that have a short time-to-market. Not that clean PHP code is impossible, it just takes some extra effort and experience.

But I love PHP because it lets me express what I want without typing an essay.

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 }

And yes, that includes not typing Int .


Stream Handlers le permite extender el "FileSystem" con una lógica que, por lo que yo sé, es bastante difícil de hacer en la mayoría de los demás idiomas.

Por ejemplo, con el controlador MS-Excel Stream puede crear un archivo MS Excel de la siguiente manera:

$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);


Here''s one, I like how setting default values on function parameters that aren''t supplied is much easier:

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


I''m a bit like you, I''ve coded PHP for over 8 years. I had to take a .NET/C# course about a year ago and I really enjoyed the C# language (hated ASP.NET) but it made me a better PHP developer.

PHP as a language is pretty poor, but, I''m extremely quick with it and the LAMP stack is awesome. The end product far outweighs the sum of the parts.

That said, in answer to your question:

http://uk.php.net/SPL

I love the SPL , the collection class in C# was something that I liked as soon as I started with it. Now I can have my cake and eat it.

Andrés


I''m a little surprised no-one has mentioned it yet, but one of my favourite tricks with arrays is using the plus operator. It is a little bit like array_merge() but a little simpler. I''ve found it''s usually what I want. In effect, it takes all the entries in the RHS and makes them appear in a copy of the LHS, overwriting as necessary (ie it''s non-commutative). Very useful for starting with a "default" array and adding some real values all in one hit, whilst leaving default values in place for values not provided.

Code sample requested:

// 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 );