{"id":627,"date":"2016-06-10T00:33:23","date_gmt":"2016-06-10T06:33:23","guid":{"rendered":"http:\/\/projectopy.com\/programacion\/?p=627"},"modified":"2016-06-10T00:33:23","modified_gmt":"2016-06-10T06:33:23","slug":"php-funciones","status":"publish","type":"post","link":"https:\/\/iscodigo.com\/blog\/php\/php-funciones\/","title":{"rendered":"PHP: Funciones"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_72 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Tabla de Contenidos<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 eztoc-toggle-hide-by-default' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/iscodigo.com\/blog\/php\/php-funciones\/#Definicion\" title=\"Definici\u00f3n\">Definici\u00f3n<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/iscodigo.com\/blog\/php\/php-funciones\/#Valores_por_defecto\" title=\"Valores por defecto\">Valores por defecto<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/iscodigo.com\/blog\/php\/php-funciones\/#Parametros_dinamicos\" title=\"Par\u00e1metros din\u00e1micos\">Par\u00e1metros din\u00e1micos<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/iscodigo.com\/blog\/php\/php-funciones\/#Parametros_por_Valor_y_por_Referencia\" title=\"Par\u00e1metros por Valor y por Referencia\">Par\u00e1metros por Valor y por Referencia<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/iscodigo.com\/blog\/php\/php-funciones\/#Funciones_Condicionales\" title=\"Funciones Condicionales\">Funciones Condicionales<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/iscodigo.com\/blog\/php\/php-funciones\/#Funciones_Dentro_de_Funciones\" title=\"Funciones Dentro de Funciones\">Funciones Dentro de Funciones<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/iscodigo.com\/blog\/php\/php-funciones\/#Funciones_Anonimas\" title=\"Funciones An\u00f3nimas\">Funciones An\u00f3nimas<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/iscodigo.com\/blog\/php\/php-funciones\/#Documentacion\" title=\"Documentaci\u00f3n\">Documentaci\u00f3n<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"Definicion\"><\/span>Definici\u00f3n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li>Para definir una funci\u00f3n en PHP se utiliza la palabra <code>function<\/code>.<\/li>\n<li>Trate de definir las funciones de forma que definan lo que hacen. Una idea es establecer la combinaci\u00f3n verbo y sustantivo. Ejemplo: <code>inicializarVariables()<\/code><\/li>\n<li>PHP no admite sobrecarga de funciones.<\/li>\n<li>Las funciones admiten recursividad. Sin embargo, las llamadas a funciones\/m\u00e9todos recursivos con m\u00e1s de 100-200 niveles de recursividad pueden agotar la pila y ocasionar la finalizaci\u00f3n del script en curso. Especialmente, las recursividades infinitas est\u00e1n consideradas un error de programaci\u00f3n.<\/li>\n<li>Los nombres de las funciones son insensibles a may\u00fasculas-min\u00fasculas, aunque es una buena idea llamar a las funciones tal y como aparecen en sus declaraciones.<\/li>\n<li>Todas las funciones y clases de PHP tienen \u00e1mbito global. Se pueden llamar desde fuera de una funci\u00f3n incluso si fueron definidas dentro, y viceversa.<\/li>\n<li>Hasta la versi\u00f3n 5 de PHP no se pod\u00eda definir el tipo de retorno, cosa que en la versi\u00f3n 7 es posible<\/li>\n<\/ul>\n<pre class=\"lang:php decode:true\" title=\"Definici\u00f3n de una funci\u00f3n\">&lt;?php\n\nfunction suma($a, $b)\n{\n    return $a + $b;\n}\n\nsuma (3, 8); \/\/ Devuelve 11<\/pre>\n<pre class=\"lang:php decode:true\" title=\"Funciones con retorno definido\">&lt;?php\n\n\/\/ En PHP 7.0 es posible definir el retorno de una funci\u00f3n\n\/\/ y tambi\u00e9n definir el tipo de dato de los par\u00e1metros.\nfunction sumaEnteros(int $a, int $b): int\n{\n    return $a + $b;\n}\n\nsumaEnteros(2, 3.5);  \/\/ Suma 5\nsumaEnteros(3, 'a');  \/\/ Genera error<\/pre>\n<pre class=\"lang:php decode:true\" title=\"Funciones en Modo estricto\">&lt;?php\n\n\/\/ Declarando Modo Estricto para la funci\u00f3n\ndeclare(strict_types=1);\n\nfunction sumaEnteros(int $a, int $b): int\n{\n    return $a + $b;\n}\n\nvar_dump(sumaEnteros(3, 3.5));  \/\/ Error, el segundo parametro es float<\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Valores_por_defecto\"><\/span>Valores por defecto<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Puede utilizar valores por defecto en los par\u00e1metros de una funci\u00f3n.<\/p>\n<pre class=\"lang:php decode:true\" title=\"Valor por defecto\">&lt;?php\n\nfunction viajar($transporte = 'a pie')\n{\n    echo 'Viajar\u00e9... ', $transporte;\n}\n\n\/\/ Prueba\nviajar('en tren.'); \/\/ Viajar\u00e9... en tren\nviajar(); \/\/ Viajar\u00e9... a pie\n<\/pre>\n<p>Es de hacer notar que si hay varios par\u00e1metros en la funci\u00f3n y no todos tienen valores por defecto, los que s\u00ed lo tienen deben quedar en las \u00faltimas posiciones de la funci\u00f3n.<\/p>\n<pre class=\"lang:php decode:true\" title=\"Valor por defecto mal elaborado\">&lt;?php\n\nfunction hacerPastel($tipo = 'normal', $sabor)\n{\n    echo 'El pastel es ', $tipo, ', el sabor es de ', $sabor;\n}\n\nhacerPastel('chocolate');  \/\/ Error, valor indefinido de $sabor<\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Parametros_dinamicos\"><\/span>Par\u00e1metros din\u00e1micos<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Es posible tener funciones que permitan establecer un n\u00famero de par\u00e1metros indefinidos.<\/p>\n<pre class=\"lang:php decode:true\" title=\"Par\u00e1metros indefinidos\">&lt;?php\n\nfunction sumatoria()\n{\n    \/\/ Obtener el total de parametros en una funci\u00f3n\n    $numeroParametros = func_num_args();\n\n    \/\/ Obtener el arreglo de parametros\n    $arregloParametros = func_get_args();\n\n    $total = 0;\n\n    for ($i = 0; $i &lt; $numeroParametros; $i++) {\n        $total += $arregloParametros[$i];\n    }\n\n    return $total;\n}\n\nvar_dump(sumatoria(1, 'x'));\nvar_dump(sumatoria(1, 2, 3));\nvar_dump(sumatoria(1, 2, 3, 4));<\/pre>\n<p>A partir de PHP 7, es posible simplificar la declaraci\u00f3n de la funci\u00f3n\u00a0si estos manejan un tipo de datos espec\u00edfico.<\/p>\n<pre class=\"lang:php decode:true\" title=\"Parametros indefinidos PHP 7.0\">&lt;?php\n\nfunction sumatoria(int ...$params)\n{\n    $total = 0;\n\n    for ($i = 0; $i &lt; count($params); $i++) {\n      $total += $params[$i];\n    }\n\n    return $total;\n}\n\nvar_dump(sumatoria(1, 2));\nvar_dump(sumatoria(1, 2, 3));\nvar_dump(sumatoria(1, 2, 3, 4));<\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Parametros_por_Valor_y_por_Referencia\"><\/span>Par\u00e1metros por Valor y por Referencia<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Al igual que en la asignaci\u00f3n de variables, dentro de los par\u00e1metros de una funci\u00f3n pueden pasarse por valor o por referencia.<\/p>\n<pre class=\"lang:php decode:true\" title=\"Paso por valor y por referencia en una funci\u00f3n\">&lt;?php\n\n\/\/ Argumento pasado por valor\nfunction duplicarValor($parametro)\n{\n    $parametro *= 2;\n}\n\n$a = 10;               \/\/ $a = 10\nduplicarValor($a);     \/\/ $a = 20\nvar_dump($a);          \/\/ $a = 10, la variable no cambia\n<\/pre>\n<pre class=\"lang:php decode:true\" title=\"Paso por valor y por referencia en una funci\u00f3n\">&lt;?php\n\n\/\/ Argumento pasado por referencia\nfunction duplicarReferencia(&amp; $parametro)\n{\n    $parametro *= 2;\n}\n\n$b = 10;                \/\/ $b = 10\nduplicarReferencia($b); \/\/ $b = 20\nvar_dump($b);           \/\/ $b = 20, la variable cambia\n<\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Funciones_Condicionales\"><\/span>Funciones Condicionales<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<pre class=\"lang:php decode:true\" title=\"Funciones condicionales\">&lt;?php\n\n\/\/ Funciones condicionales. La funci\u00f3n uno() no existe hasta evaluar el IF\n$hacer = true;\n\nif ($hacer) {\n    function uno() {\n        echo 'Llamado a uno()';\n    }\n}\n\nuno(); \/\/ Solo ser\u00e1 llamado si la condici\u00f3n es TRUE<\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Funciones_Dentro_de_Funciones\"><\/span>Funciones Dentro de Funciones<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<pre class=\"lang:php decode:true \" title=\"Funciones dentro de funciones\">&lt;?php\n\n\/\/ Funciones dentro de funciones.\n\/\/ Mientras no se llama a externa(), interna() no existe.\nfunction externa() {\n    function interna() {\n        echo 'Llamado a interna()';\n    }\n}\n\n\/\/interna();\n\n\/\/ Las funciones y clases tiene un \u00e1mbito global.\n\/\/ Se pueden llamar desde fuera de una funci\u00f3n incluso\n\/\/ si fueron definidas internamente.\nexterna();\ninterna();<\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Funciones_Anonimas\"><\/span>Funciones An\u00f3nimas<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Son funciones que no tienen nombre, denominadas tambi\u00e9n funciones Lambda.<\/p>\n<pre class=\"lang:php decode:true \" title=\"Funciones an\u00f3nimas\">&lt;?php\n\n$saludo = function($mensaje)\n{\n    echo \"Hola \", $mensaje;\n};\n\n$saludo('Mundo'); \/\/ Imprime 'Hola Mundo'\n$saludo('PHP');   \/\/ Imprime 'Hola PHP'<\/pre>\n<p>Es posible establecer argumentos de funciones, utilizando otras funciones.<\/p>\n<pre>&lt;?php\n\nfunction saludar($mensaje)\n{\n    echo 'Hola ', $mensaje;\n}\n\nsaludar(function () {\n    return $mensaje;\n});\n<\/pre>\n<p>Cuando se accede\u00a0una variable que est\u00e1 fuera del \u00e1mbito de una funci\u00f3n se denomina Closure.<\/p>\n<pre>$persona = \"Pedro\";\n \n$saludo = function() use ($persona) {\n  echo \"Hola $persona\";\n};\n\n$saludo();\n<\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Documentacion\"><\/span>Documentaci\u00f3n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><a href=\"http:\/\/php.net\/manual\/es\/functions.user-defined.php\" target=\"_blank\" rel=\"noopener\">Funciones en PHP<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Definici\u00f3n Para definir una funci\u00f3n en PHP se utiliza la palabra function. Trate de definir las funciones de forma que definan lo que hacen. Una idea es establecer la combinaci\u00f3n verbo y sustantivo. Ejemplo: inicializarVariables() PHP no admite sobrecarga de funciones. Las funciones admiten recursividad. Sin embargo, las llamadas a funciones\/m\u00e9todos recursivos con m\u00e1s de [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[46],"tags":[88],"class_list":["post-627","post","type-post","status-publish","format-standard","hentry","category-php","tag-funciones"],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/iscodigo.com\/blog\/wp-json\/wp\/v2\/posts\/627","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/iscodigo.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/iscodigo.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/iscodigo.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/iscodigo.com\/blog\/wp-json\/wp\/v2\/comments?post=627"}],"version-history":[{"count":0,"href":"https:\/\/iscodigo.com\/blog\/wp-json\/wp\/v2\/posts\/627\/revisions"}],"wp:attachment":[{"href":"https:\/\/iscodigo.com\/blog\/wp-json\/wp\/v2\/media?parent=627"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/iscodigo.com\/blog\/wp-json\/wp\/v2\/categories?post=627"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/iscodigo.com\/blog\/wp-json\/wp\/v2\/tags?post=627"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}