functions.xml

[email protected] (Gustav Tiger) Sun, 01 Feb 2004 02:23:31 +0100
Newsgroups php.doc.sv
Message-ID <[email protected]>
-- 
_________________________________________
Gustav Tiger
Bergs Gymnasium

Sweden
functions.xml (text/xml, 15.5 KB)
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- $Revision: 1.44 $ -->
 <chapter id="functions">
  <title>Funktioner</title>

  <sect1 id="functions.user-defined">
   <title>Användardefinierade funktioner</title>
 
   <para>
    En funktion kan definieras med följande syntax:
   </para>
   <para>
    <example>
     <title>Pseudokod för att demonstrera funktionsanvändning</title>
     <programlisting role="php">
<![CDATA[
<?php
function foo ($arg_1, $arg_2, /* ..., */ $arg_n)
{
    echo "Exempelfunktion.\n";
    return $retval;
}
?>
]]>
     </programlisting>
    </example>
   </para>
   
   <!--
    
    status of func(const $param) ?
    zend doesn't care at all whether or not you specify it.
    I've never seen it before... what's its use? (or was...)
    
    -->
     
   <simpara>
    Vilken giltig PHP-kod som helst kan förekomma inne i en funktion. 
				Till och med andra funktioner och 
				<link linkend="keyword.class">class</link>-definitioner.
   </simpara>
   <simpara>
    I PHP 3 så måste funktionerna vara definierade före de används. I 
    PHP 4 är detta inte nödvändigt. <emphasis>Förutom</emphasis> när en
    funktion är villkorligt definierad som de två exemplen nedan.
   </simpara>
   <para>
    När en funktion är definierad i ett villkorsblock som de två exemplen 
    visar så måste funktiondefinitionen köras <emphasis>före</emphasis>
    funktionen blir anropad.
   </para>
   <para>
    <example>
     <title>Villkorliga funktioner</title>
     <programlisting role="php">
<![CDATA[
<?php

$makefoo = true;

/* Vi kan inte anropa foo() from här
   eftersom den inte existerar än.
   Men vi kan anropa bar() */

bar();

if ($makefoo) {
  function foo ()
  {
    echo "Jag existerar inte innan programkörningen når mig.\n";
  }
}

/* Nu kan vi säkert anropa foo()
   eftersom $makefoo är satt till true */

if ($makefoo) foo();

function bar() 
{
  echo "Jag existerar direkt vid programstart\n";
}

?>
]]>
     </programlisting>
    </example>
   </para>
   <para>
    <example>
     <title>Funktioner inuti funktioner</title>
     <programlisting role="php">
<![CDATA[
<?php
function foo() 
{
  function bar() 
  {
    echo "Jag existerar inte förrän foo() har blivit anropad.\n";
  }
}

/* Vi kan inte anropa bar() än
   eftersom den inte existerar. */

foo();

/* Nu kan vi anropa bar(),
   foo() har körts och gjort
   bar() tillgänglig. */

bar();

?>  
]]>
     </programlisting>
    </example>
   </para>
   <simpara>
    PHP stödjer inte funktionsöverlagring. Det är heller inte möjligt att 
    avdefiniera eller omdefiniera tidigare deklarerade funktion.
   </simpara>
   <note>
    <simpara>
     Funktionsnamn är inte teckenkänsliga men det är smartast och anses
					som god sed att anropa funktionen som den ser ut i deklarationen.
    </simpara>
   </note>   
   <simpara>
    PHP 3 stödjer inte funktioner med varierbart antal argument men
				stödjer standardvärlden för argument i funktioner (se 
			 <link linkend="functions.arguments.default">standardvärden för 
				argument</link> för mer information). PHP 4 stödjer båda: se <link
    linkend="functions.variable-arg-list">Argumentlistor med varierbar 
				längd</link> och funktionsreferenserna för 
    <function>func_num_args</function>,
    <function>func_get_arg</function>, och
    <function>func_get_args</function> för mer information.
   </simpara>

  </sect1>
 
  <sect1 id="functions.arguments">
   <title>Funktionsargument</title>
 
   <simpara>
    Information kan skickas till funktioner via argumentlistan som
    är en kommaseparerad lista av variabler och/eller konstanter.
   </simpara> 
   <para>
    PHP stödjer värden skickas som argument (standard), <link
    linkend="functions.arguments.by-reference">skickas som 
    referens</link>, och <link
    linkend="functions.arguments.default">standardargumentsvärden
    </link>. Argumentlistor med varierbar längd stödjs bara i PHP
    4 och senare; se <link
    linkend="functions.variable-arg-list">Argumentlistor med 
				varierbar längd</link> och funktionsreferenserna för
    <function>func_num_args</function>,
    <function>func_get_arg</function>, och
    <function>func_get_args</function> för mer information. En 
    liknande effekt går att åstadkomma i PHP 3 genom att skicka
				en vektor med argument till en funktion.
   </para>
   <para>
    <example>
     <title>Skicka vektorer till funktioner</title>
     <programlisting role="php">
<![CDATA[
<?php
function tar_vektor($input)
{
    echo "$input[0] + $input[1] = ", $input[0]+$input[1];
}
?>
]]>
     </programlisting>
    </example>
   </para>
 
   <sect2 id="functions.arguments.by-reference">
    <title>Gör så att argument skickas som referens</title>
 
    <simpara>
     Som standard skickas funktionsargument som värden (så om du ändrar
					argumentvärdet inuti funktion så ändras den inte utanför funktionen) 
     Om du vill tillåta funktionen att modifiera dess argument så måste du
					skicka argumenten som referens.
    </simpara>
    <para>
     Om du vill att ett argument till en funktion alltid skickas som
					referens så kan du sätta ett &amp;-tecken före argumentnamenet
     i funktionsdefinitionen:
    </para>
    <para>
     <example>
      <title>Skicka funktionsparametrar som referenser</title>
      <programlisting role="php">
<![CDATA[
<?php
function add_some_extra(&$string)
{
    $string .= 'and something extra.';
}
$str = 'This is a string, ';
add_some_extra($str);
echo $str;    // outputs 'This is a string, and something extra.'
?>
]]>
      </programlisting>
     </example>
    </para>
 
   </sect2>
 
   <sect2 id="functions.arguments.default">
    <title>Standardvärden för argument</title>
 
    <para>
     En funktion kan definiera standardvärden för argument precis 
					som i C++. Såhär fungerar det:
    </para>
    <para>
     <example>
      <title>Användning av standardvärden för argument i funktioner</title>
      <programlisting role="php">
<![CDATA[
<?php
function makecoffee ($type = "cappuccino")
{
    return "Making a cup of $type.\n";
}
echo makecoffee ();
echo makecoffee ("espresso");
?>
]]>
      </programlisting>
     </example>
    </para>
 
    <para>
     Utmatningen från exemplet ovanför ser ut såhär:
    </para>
    <para>
     <screen>
Making a cup of cappuccino.
Making a cup of espresso.
     </screen>
    </para>
 
    <simpara>
     Standardvärdet måste vara ett konstant uttrycka alltså inte till
     exempel en variabel, en klassmedlem eller ett funktionsanrop.
    </simpara>
    <para>
     När man använder standardargument så bör dessa argument vara till 
					höger	sida av de argument som inte använder standardargument; annars 
					kommer det inte att fungera som väntat. Titta på följande exempel:
    </para>
    <para>
     <example>
      <title>Felaktig användning av standardargument i funktioner</title>
      <programlisting role="php">
<![CDATA[
<?php
function makeyogurt ($type = "acidophilus", $flavour)
{
    return "Making a bowl of $type $flavour.\n";
}
 
echo makeyogurt ("raspberry");   // won't work as expected
?>
]]>
      </programlisting>
     </example>
    </para>
 
    <para>
     Utmatningen från exemplet ovanför blir:
    </para>
    <para>
     <screen>
Warning: Missing argument 2 in call to makeyogurt() in 
/usr/local/etc/httpd/htdocs/php3test/functest.html on line 41
Making a bowl of raspberry .
     </screen>
    </para>
    <para>
     Jämför nu exemplet ovanför med detta:
    </para>
    <para>
     <example>
      <title>Korrekt användning av standarargument i funktioner</title>
      <programlisting role="php">
<![CDATA[
<?php
function makeyogurt ($flavour, $type = "acidophilus")
{
    return "Making a bowl of $type $flavour.\n";
}
 
echo makeyogurt ("raspberry");   // works as expected
?>
]]>
      </programlisting>
     </example>
    </para>
 
    <para>
     Utmatningen från exemplet ovanför är:
    </para>
    <para>
     <screen>
Making a bowl of acidophilus raspberry.
     </screen>
    </para>

   </sect2>

   <sect2 id="functions.variable-arg-list">
    <title>Argumentlistor med varierbar längd</title>
	
    <simpara>
     PHP 4 har stöd för argumentlistor med varierbar längd i 
     användardefinierade funktioner. Det är riktigt enkelt faktiskt,
					använd bara funktionerna 
     <function>func_num_args</function>,
     <function>func_get_arg</function>, och
     <function>func_get_args</function>.
    </simpara>

    <simpara>
     Ingen speciell syntax krävs och argumentlistor kan fortfarande
					vara tillhandahållna i funktionsdefinitionerna och	kommer att 
					fungera som normalt.
    </simpara>

   </sect2>

  </sect1>
 
  <sect1 id="functions.returning-values">
   <title>Returnera värden</title>
 
   <para>
    Värden returneras genom att använda den valfria returnstatsen.
				Alla typer kan returneras, även listor och objekt. 
				Returnsatsen gör så att funktionen avslutar sin körning 
				omedelbart och återger kontrollen till den rad som funktionen
				anropades från. För mer information, se 
				<function>return</function>.
   </para>
   <para>
    <example>
     <title>Använding av <function>return</function></title>
     <programlisting role="php">
<![CDATA[
<?php
function square ($num)
{
    return $num * $num;
}
echo square (4);   // outputs '16'.
?>
]]>
     </programlisting>
    </example>
   </para>
      
   <para>
    Du kan inte returnera flera värden från en funktion men
				du kan få en liknande effekt genom att returnera en lista.
   </para>
   <para>
    <example>
     <title>Returnera en vektor för att få flera värden</title>
     <programlisting role="php">
<![CDATA[
<?php
function small_numbers()
{
    return array (0, 1, 2);
}
list ($zero, $one, $two) = small_numbers();
?>
]]>
     </programlisting>
    </example>
   </para>
   <para>
    För att returnera en referens från en funktion måste du använda 
				referensoperatorn &amp; i både funktionsdeklarationen och när 
				du tilldelar returvärdet till en variabel:
   </para>
   <para>
    <example>
     <title>Returnera en referens från en funktion</title>
     <programlisting role="php">
<![CDATA[
<?php
function &returns_reference()
{
    return $someref;
}

$newref =& returns_reference();
?>
]]>
     </programlisting>
    </example>
   </para>
   <simpara>
    För mer information om referenser, se 
				<link linkend="language.references">referenser förklarade</link>.
   </simpara>
  </sect1>
 
  <sect1 id="functions.variable-functions">
   <title>Variabelfunktioner</title>

   <para>
			 PHP stödjer konceptet om variabelfunktioner. Med de menas att om
				ett variabelnamn har parenteser efter sig så kommer PHP att leta
				efter en funktion med samma namn som variabeln innehåll blir och
				försöker köra den funktionen. Det här kan bland annat användas till
				att implementera callbacks, funktionstabeller.
   </para>
   <para>
    Variablefunktioner kommer inte att fungera med språkkonstruktioner
				som <function>echo</function>, <function>print</function>,
    <function>unset</function>, <function>isset</function>,
    <function>empty</function>, <function>include</function>,
    <function>require</function> och liknande. Du måste använda dina
				egna wrapper-funktioner för att kunna utnyttja dessa konstruktioner
				som variabelfunktioner.
   </para>
   <para>
    <example>
     <title>Exempel på variabelfunktioner</title>
     <programlisting role="php">
<![CDATA[
<?php
function foo() {
    echo "In foo()<br />\n";
}

function bar($arg = '')
{
    echo "In bar(); argument was '$arg'.<br />\n";
}

// This is a wrapper function around echo
function echoit($string)
{
    echo $string;
}

$func = 'foo';
$func();        // This calls foo()

$func = 'bar';
$func('test');  // This calls bar()

$func = 'echoit';
$func('test');  // This calls echoit()
?>
]]>
     </programlisting>
    </example>
   </para>
   <para>
    Du kan också anropa objektmetoder genom att använda variabelfunktioner.
    <example>
     <title>Exempel på variabelmetoder</title>
     <programlisting role="php">
<![CDATA[
<?php
class Foo
{
    function Variable()
    {
        $name = 'Bar';
        $this->$name(); // This calls the Bar() method
    }
    
    function Bar()
    {
        echo "This is Bar";
    }
}

$foo = new Foo();
$funcname = "Variable";
$foo->$funcname();  // This calls $foo->Variable()

?>
]]>
     </programlisting>
    </example>
   </para>
   <para>
    Se också <function>call_user_func</function>,
    <link linkend="language.variables.variable">
    variable variables</link> och <function>function_exists</function>.
   </para>
  </sect1>
  
  <sect1 id="functions.internal">
   <title>Interna (inbyggda) funktioner</title>
   
   <para>
			 PHP kommer som standard med många funktioner och konstruktioner. Det
				finns också funktioner som är specifika för PHP:s tilläggsprogram och
				kräver att dessa är kompilerade med PHP för att fungera. Anropar du dessa
				utan att ha tilläggsprogrammet så kommer du att få ett felmeddelande som 
				säger att funktioner inte är definierad. För att kunna använda
    <link linkend="ref.image">image</link>-funktioner som till exempel 
    <function>imagecreatetruecolor</function> så måste PHP vara kompilerat
				med stöd för GD. Eller för att använda 
				<function>mysql_connect</function> så måste ditt PHP vara kompilerat 
				med stöd för <link linkend="ref.mysql">MySQL</link>. Det finns många 
				kärnfunktioner som är inkluderade i varje version av PHP. Till exempel
    <link linkend="ref.strings">sträng</link>- och
    <link linkend="ref.variables">variabel</link>-funktioner.  Ett anrop 
    till <function>phpinfo</function> eller 
    <function>get_loaded_extensions</function> kommer att visa vilka
    tilläggsprogram som är laddade i ditt PHP. Notera också att det är
				många tilläggsprogram som är med i PHP som standard och att PHP-manualen
				är uppdelade med en sektion för varje tillägg.
    Se <link linkend="configuration">konfiguration</link>,  
    <link linkend="installation">installation</link> och tilläggsprogrammens
    kapitel för mer information om hur du kan konfigurerar ditt PHP.
   </para>
   <para>
    Att läsa och förstå en funktions prototyp är förklarat i manualdelen om
    <link linkend="about.prototypes">hur man läser en funktionsdefinition</link>.
    Det är viktigt att förstå vad en funktion returnerar eller om den arbetar
				direkt på ett skickat värde genom referenser. <function>str_replace</function> 
				kommer exempelvis att returnera en modifierad textsträng medan 
    <function>usort</function> arbetar direkt på den inskickade variabeln.
    Varje manualsida har också specifik information om varje funktion, dess
				parametrar, beteende, returvärden för både lyckad och icke-lyckad körning
				och i vilka PHP-versioner funktione finns tillgänglig i.	Att förstå dessa viktiga 
				(och ofta hårfina) skillnader är livsviktigt för	att kunna skriva en 
				korrekt PHP-kod.
   </para>
   <para>
    Se också <function>function_exists</function>, 
    <link linkend="funcref">the function reference</link>,
    <function>get_extension_funcs</function>, och 
    <function>dl</function>.
   </para>
  </sect1>

 </chapter>
 
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"../../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->