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 &-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 & 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
-->