<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>Function arguments</title> </head> <body><div class="manualnavbar" style="text-align: center;"> <div class="prev" style="text-align: left; float: left;"><a href="functions.user-defined.html">User-defined functions</a></div> <div class="next" style="text-align: right; float: right;"><a href="functions.returning-values.html">Returning values</a></div> <div class="up"><a href="language.functions.html">Functions</a></div> <div class="home"><a href="index.html">PHP Manual</a></div> </div><hr /><div id="functions.arguments" class="sect1"> <h2 class="title">Function arguments</h2> <p class="simpara"> Information may be passed to functions via the argument list, which is a comma-delimited list of expressions. The arguments are evaluated from left to right. </p> <p class="para"> PHP supports passing arguments by value (the default), <a href="functions.arguments.html#functions.arguments.by-reference" class="link">passing by reference</a>, and <a href="functions.arguments.html#functions.arguments.default" class="link">default argument values</a>. <a href="functions.arguments.html#functions.variable-arg-list" class="link">Variable-length argument lists</a> are also supported. </p> <p class="para"> <div class="example" id="example-136"> <p><strong>Example #1 Passing arrays to functions</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">takes_array</span><span style="color: #007700">(</span><span style="color: #0000BB">$input</span><span style="color: #007700">)<br />{<br /> echo </span><span style="color: #DD0000">"</span><span style="color: #0000BB">$input</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">]</span><span style="color: #DD0000"> + </span><span style="color: #0000BB">$input</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">]</span><span style="color: #DD0000"> = "</span><span style="color: #007700">, </span><span style="color: #0000BB">$input</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">]+</span><span style="color: #0000BB">$input</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">];<br />}<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> </div> </p> <div class="sect2" id="functions.arguments.by-reference"> <h3 class="title">Passing arguments by reference</h3> <p class="simpara"> By default, function arguments are passed by value (so that if the value of the argument within the function is changed, it does not get changed outside of the function). To allow a function to modify its arguments, they must be passed by reference. </p> <p class="para"> To have an argument to a function always passed by reference, prepend an ampersand (&) to the argument name in the function definition: </p> <p class="para"> <div class="example" id="example-137"> <p><strong>Example #2 Passing function parameters by reference</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">add_some_extra</span><span style="color: #007700">(&</span><span style="color: #0000BB">$string</span><span style="color: #007700">)<br />{<br /> </span><span style="color: #0000BB">$string </span><span style="color: #007700">.= </span><span style="color: #DD0000">'and something extra.'</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">$str </span><span style="color: #007700">= </span><span style="color: #DD0000">'This is a string, '</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">add_some_extra</span><span style="color: #007700">(</span><span style="color: #0000BB">$str</span><span style="color: #007700">);<br />echo </span><span style="color: #0000BB">$str</span><span style="color: #007700">; </span><span style="color: #FF8000">// outputs 'This is a string, and something extra.'<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> </div> </p> </div> <div class="sect2" id="functions.arguments.default"> <h3 class="title">Default argument values</h3> <p class="para"> A function may define C++-style default values for scalar arguments as follows: </p> <p class="para"> <div class="example" id="example-138"> <p><strong>Example #3 Use of default parameters in functions</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">makecoffee</span><span style="color: #007700">(</span><span style="color: #0000BB">$type </span><span style="color: #007700">= </span><span style="color: #DD0000">"cappuccino"</span><span style="color: #007700">)<br />{<br /> return </span><span style="color: #DD0000">"Making a cup of </span><span style="color: #0000BB">$type</span><span style="color: #DD0000">.\n"</span><span style="color: #007700">;<br />}<br />echo </span><span style="color: #0000BB">makecoffee</span><span style="color: #007700">();<br />echo </span><span style="color: #0000BB">makecoffee</span><span style="color: #007700">(</span><span style="color: #0000BB">null</span><span style="color: #007700">);<br />echo </span><span style="color: #0000BB">makecoffee</span><span style="color: #007700">(</span><span style="color: #DD0000">"espresso"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> <div class="example-contents"><p>The above example will output:</p></div> <div class="example-contents screen"> <div class="cdata"><pre> Making a cup of cappuccino. Making a cup of . Making a cup of espresso. </pre></div> </div> </div> </p> <p class="para"> PHP also allows the use of <span class="type"><a href="language.types.array.html" class="type array">array</a></span>s and the special type <strong><code>NULL</code></strong> as default values, for example: </p> <p class="para"> <div class="example" id="example-139"> <p><strong>Example #4 Using non-scalar types as default values</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">makecoffee</span><span style="color: #007700">(</span><span style="color: #0000BB">$types </span><span style="color: #007700">= array(</span><span style="color: #DD0000">"cappuccino"</span><span style="color: #007700">), </span><span style="color: #0000BB">$coffeeMaker </span><span style="color: #007700">= </span><span style="color: #0000BB">NULL</span><span style="color: #007700">)<br />{<br /> </span><span style="color: #0000BB">$device </span><span style="color: #007700">= </span><span style="color: #0000BB">is_null</span><span style="color: #007700">(</span><span style="color: #0000BB">$coffeeMaker</span><span style="color: #007700">) ? </span><span style="color: #DD0000">"hands" </span><span style="color: #007700">: </span><span style="color: #0000BB">$coffeeMaker</span><span style="color: #007700">;<br /> return </span><span style="color: #DD0000">"Making a cup of "</span><span style="color: #007700">.</span><span style="color: #0000BB">join</span><span style="color: #007700">(</span><span style="color: #DD0000">", "</span><span style="color: #007700">, </span><span style="color: #0000BB">$types</span><span style="color: #007700">).</span><span style="color: #DD0000">" with </span><span style="color: #0000BB">$device</span><span style="color: #DD0000">.\n"</span><span style="color: #007700">;<br />}<br />echo </span><span style="color: #0000BB">makecoffee</span><span style="color: #007700">();<br />echo </span><span style="color: #0000BB">makecoffee</span><span style="color: #007700">(array(</span><span style="color: #DD0000">"cappuccino"</span><span style="color: #007700">, </span><span style="color: #DD0000">"lavazza"</span><span style="color: #007700">), </span><span style="color: #DD0000">"teapot"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> </div> </p> <p class="simpara"> The default value must be a constant expression, not (for example) a variable, a class member or a function call. </p> <p class="para"> Note that when using default arguments, any defaults should be on the right side of any non-default arguments; otherwise, things will not work as expected. Consider the following code snippet: </p> <p class="para"> <div class="example" id="example-140"> <p><strong>Example #5 Incorrect usage of default function arguments</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">makeyogurt</span><span style="color: #007700">(</span><span style="color: #0000BB">$type </span><span style="color: #007700">= </span><span style="color: #DD0000">"acidophilus"</span><span style="color: #007700">, </span><span style="color: #0000BB">$flavour</span><span style="color: #007700">)<br />{<br /> return </span><span style="color: #DD0000">"Making a bowl of </span><span style="color: #0000BB">$type</span><span style="color: #DD0000"> </span><span style="color: #0000BB">$flavour</span><span style="color: #DD0000">.\n"</span><span style="color: #007700">;<br />}<br /> <br />echo </span><span style="color: #0000BB">makeyogurt</span><span style="color: #007700">(</span><span style="color: #DD0000">"raspberry"</span><span style="color: #007700">); </span><span style="color: #FF8000">// won't work as expected<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> <div class="example-contents"><p>The above example will output:</p></div> <div class="example-contents screen"> <div class="cdata"><pre> Warning: Missing argument 2 in call to makeyogurt() in /usr/local/etc/httpd/htdocs/phptest/functest.html on line 41 Making a bowl of raspberry . </pre></div> </div> </div> </p> <p class="para"> Now, compare the above with this: </p> <p class="para"> <div class="example" id="example-141"> <p><strong>Example #6 Correct usage of default function arguments</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">makeyogurt</span><span style="color: #007700">(</span><span style="color: #0000BB">$flavour</span><span style="color: #007700">, </span><span style="color: #0000BB">$type </span><span style="color: #007700">= </span><span style="color: #DD0000">"acidophilus"</span><span style="color: #007700">)<br />{<br /> return </span><span style="color: #DD0000">"Making a bowl of </span><span style="color: #0000BB">$type</span><span style="color: #DD0000"> </span><span style="color: #0000BB">$flavour</span><span style="color: #DD0000">.\n"</span><span style="color: #007700">;<br />}<br /> <br />echo </span><span style="color: #0000BB">makeyogurt</span><span style="color: #007700">(</span><span style="color: #DD0000">"raspberry"</span><span style="color: #007700">); </span><span style="color: #FF8000">// works as expected<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> <div class="example-contents"><p>The above example will output:</p></div> <div class="example-contents screen"> <div class="cdata"><pre> Making a bowl of acidophilus raspberry. </pre></div> </div> </div> </p> <blockquote class="note"><p><strong class="note">Note</strong>: <span class="simpara"> As of PHP 5, arguments that are passed by reference may have a default value. </span> </p></blockquote> </div> <div class="sect2" id="functions.arguments.type-declaration"> <h3 class="title">Type declarations</h3> <blockquote class="note"><p><strong class="note">Note</strong>: <p class="para"> Type declarations were also known as type hints in PHP 5. </p> </p></blockquote> <p class="para"> Type declarations allow functions to require that parameters are of a certain type at call time. If the given value is of the incorrect type, then an error is generated: in PHP 5, this will be a recoverable fatal error, while PHP 7 will throw a <a href="class.typeerror.html" class="classname">TypeError</a> exception. </p> <p class="para"> To specify a type declaration, the type name should be added before the parameter name. The declaration can be made to accept <strong><code>NULL</code></strong> values if the default value of the parameter is set to <strong><code>NULL</code></strong>. </p> <div class="sect3" id="functions.arguments.type-declaration.types"> <h4 class="title">Valid types</h4> <table class="doctable informaltable"> <thead> <tr> <th>Type</th> <th>Description</th> <th>Minimum PHP version</th> </tr> </thead> <tbody class="tbody"> <tr> <td>Class/interface name</td> <td> The parameter must be an <a href="language.operators.type.html" class="link"><em>instanceof</em></a> the given class or interface name. </td> <td>PHP 5.0.0</td> </tr> <tr> <td><em>self</em></td> <td> The parameter must be an <a href="language.operators.type.html" class="link"><em>instanceof</em></a> the same class as the one the method is defined on. This can only be used on class and instance methods. </td> <td>PHP 5.0.0</td> </tr> <tr> <td><span class="type"><a href="language.types.array.html" class="type array">array</a></span></td> <td> The parameter must be an <span class="type"><a href="language.types.array.html" class="type array">array</a></span>. </td> <td>PHP 5.1.0</td> </tr> <tr> <td><span class="type"><a href="language.types.callable.html" class="type callable">callable</a></span></td> <td> The parameter must be a valid <span class="type"><a href="language.types.callable.html" class="type callable">callable</a></span>. </td> <td>PHP 5.4.0</td> </tr> <tr> <td><span class="type"><a href="language.types.boolean.html" class="type bool">bool</a></span></td> <td> The parameter must be a <span class="type"><a href="language.types.boolean.html" class="type boolean">boolean</a></span> value. </td> <td>PHP 7.0.0</td> </tr> <tr> <td><span class="type"><a href="language.types.float.html" class="type float">float</a></span></td> <td> The parameter must be a <span class="type"><a href="language.types.float.html" class="type float">float</a></span>ing point number. </td> <td>PHP 7.0.0</td> </tr> <tr> <td><span class="type"><a href="language.types.integer.html" class="type int">int</a></span></td> <td> The parameter must be an <span class="type"><a href="language.types.integer.html" class="type integer">integer</a></span>. </td> <td>PHP 7.0.0</td> </tr> <tr> <td><span class="type"><a href="language.types.string.html" class="type string">string</a></span></td> <td> The parameter must be a <span class="type"><a href="language.types.string.html" class="type string">string</a></span>. </td> <td>PHP 7.0.0</td> </tr> <tr> <td><em>iterable</em></td> <td> The parameter must be either an <span class="type"><a href="language.types.array.html" class="type array">array</a></span> or an <a href="language.operators.type.html" class="link"><em>instanceof</em></a> <a href="class.traversable.html" class="classname">Traversable</a>. </td> <td>PHP 7.1.0</td> </tr> <tr> <td><em>object</em></td> <td> The parameter must be an <span class="type"><a href="language.types.object.html" class="type object">object</a></span>. </td> <td>PHP 7.2.0</td> </tr> </tbody> </table> <div class="warning"><strong class="warning">Warning</strong> <p class="para"> Aliases for the above scalar types are not supported. Instead, they are treated as class or interface names. For example, using <em>boolean</em> as a parameter or return type will require an argument or return value that is an <a href="language.operators.type.html" class="link"><em>instanceof</em></a> the class or interface <em>boolean</em>, rather than of type <span class="type"><a href="language.types.boolean.html" class="type bool">bool</a></span>: </p> <p class="para"> <div class="example" id="example-142"> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /> </span><span style="color: #007700">function </span><span style="color: #0000BB">test</span><span style="color: #007700">(</span><span style="color: #0000BB">boolean $param</span><span style="color: #007700">) {}<br /> </span><span style="color: #0000BB">test</span><span style="color: #007700">(</span><span style="color: #0000BB">true</span><span style="color: #007700">);<br /> </span><span style="color: #0000BB">?></span> </span> </code></div> </div> <div class="example-contents"><p>The above example will output:</p></div> <div class="example-contents screen"> <div class="cdata"><pre> Fatal error: Uncaught TypeError: Argument 1 passed to test() must be an instance of boolean, boolean given, called in - on line 1 and defined in -:1 </pre></div> </div> </div> </p> </div> </div> <div class="sect3" id="functions.arguments.type-declaration.examples"> <h4 class="title">Examples</h4> <div class="example" id="example-143"> <p><strong>Example #7 Basic class type declaration</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">C </span><span style="color: #007700">{}<br />class </span><span style="color: #0000BB">D </span><span style="color: #007700">extends </span><span style="color: #0000BB">C </span><span style="color: #007700">{}<br /><br /></span><span style="color: #FF8000">// This doesn't extend C.<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">E </span><span style="color: #007700">{}<br /><br />function </span><span style="color: #0000BB">f</span><span style="color: #007700">(</span><span style="color: #0000BB">C $c</span><span style="color: #007700">) {<br /> echo </span><span style="color: #0000BB">get_class</span><span style="color: #007700">(</span><span style="color: #0000BB">$c</span><span style="color: #007700">).</span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">f</span><span style="color: #007700">(new </span><span style="color: #0000BB">C</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">f</span><span style="color: #007700">(new </span><span style="color: #0000BB">D</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">f</span><span style="color: #007700">(new </span><span style="color: #0000BB">E</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> <div class="example-contents"><p>The above example will output:</p></div> <div class="example-contents screen"> <div class="cdata"><pre> C D Fatal error: Uncaught TypeError: Argument 1 passed to f() must be an instance of C, instance of E given, called in - on line 14 and defined in -:8 Stack trace: #0 -(14): f(Object(E)) #1 {main} thrown in - on line 8 </pre></div> </div> </div> <div class="example" id="example-144"> <p><strong>Example #8 Basic interface type declaration</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #007700">interface </span><span style="color: #0000BB">I </span><span style="color: #007700">{ public function </span><span style="color: #0000BB">f</span><span style="color: #007700">(); }<br />class </span><span style="color: #0000BB">C </span><span style="color: #007700">implements </span><span style="color: #0000BB">I </span><span style="color: #007700">{ public function </span><span style="color: #0000BB">f</span><span style="color: #007700">() {} }<br /><br /></span><span style="color: #FF8000">// This doesn't implement I.<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">E </span><span style="color: #007700">{}<br /><br />function </span><span style="color: #0000BB">f</span><span style="color: #007700">(</span><span style="color: #0000BB">I $i</span><span style="color: #007700">) {<br /> echo </span><span style="color: #0000BB">get_class</span><span style="color: #007700">(</span><span style="color: #0000BB">$i</span><span style="color: #007700">).</span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">f</span><span style="color: #007700">(new </span><span style="color: #0000BB">C</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">f</span><span style="color: #007700">(new </span><span style="color: #0000BB">E</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> <div class="example-contents"><p>The above example will output:</p></div> <div class="example-contents screen"> <div class="cdata"><pre> C Fatal error: Uncaught TypeError: Argument 1 passed to f() must implement interface I, instance of E given, called in - on line 13 and defined in -:8 Stack trace: #0 -(13): f(Object(E)) #1 {main} thrown in - on line 8 </pre></div> </div> </div> <div class="example" id="example-145"> <p><strong>Example #9 Nullable type declaration</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">C </span><span style="color: #007700">{}<br /><br />function </span><span style="color: #0000BB">f</span><span style="color: #007700">(</span><span style="color: #0000BB">C $c </span><span style="color: #007700">= </span><span style="color: #0000BB">null</span><span style="color: #007700">) {<br /> </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$c</span><span style="color: #007700">);<br />}<br /><br /></span><span style="color: #0000BB">f</span><span style="color: #007700">(new </span><span style="color: #0000BB">C</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">f</span><span style="color: #007700">(</span><span style="color: #0000BB">null</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> <div class="example-contents"><p>The above example will output:</p></div> <div class="example-contents screen"> <div class="cdata"><pre> object(C)#1 (0) { } NULL </pre></div> </div> </div> </div> <div class="sect3" id="functions.arguments.type-declaration.strict"> <h4 class="title">Strict typing</h4> <p class="para"> By default, PHP will coerce values of the wrong type into the expected scalar type if possible. For example, a function that is given an <span class="type"><a href="language.types.integer.html" class="type integer">integer</a></span> for a parameter that expects a <span class="type"><a href="language.types.string.html" class="type string">string</a></span> will get a variable of type <span class="type"><a href="language.types.string.html" class="type string">string</a></span>. </p> <p class="para"> It is possible to enable strict mode on a per-file basis. In strict mode, only a variable of exact type of the type declaration will be accepted, or a <a href="class.typeerror.html" class="classname">TypeError</a> will be thrown. The only exception to this rule is that an <span class="type"><a href="language.types.integer.html" class="type integer">integer</a></span> may be given to a function expecting a <span class="type"><a href="language.types.float.html" class="type float">float</a></span>. Function calls from within internal functions will not be affected by the <em>strict_types</em> declaration. </p> <p class="para"> To enable strict mode, the <a href="control-structures.declare.html" class="link"><em>declare</em></a> statement is used with the <em>strict_types</em> declaration: </p> <div class="caution"><strong class="caution">Caution</strong> <p class="para"> Enabling strict mode will also affect <a href="functions.returning-values.html#functions.returning-values.type-declaration" class="link">return type declarations</a>. </p> </div> <blockquote class="note"><p><strong class="note">Note</strong>: <p class="para"> Strict typing applies to function calls made from <em class="emphasis">within</em> the file with strict typing enabled, not to the functions declared within that file. If a file without strict typing enabled makes a call to a function that was defined in a file with strict typing, the caller's preference (weak typing) will be respected, and the value will be coerced. </p> </p></blockquote> <blockquote class="note"><p><strong class="note">Note</strong>: <p class="para"> Strict typing is only defined for scalar type declarations, and as such, requires PHP 7.0.0 or later, as scalar type declarations were added in that version. </p> </p></blockquote> <div class="example" id="example-146"> <p><strong>Example #10 Strict typing</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #007700">declare(</span><span style="color: #0000BB">strict_types</span><span style="color: #007700">=</span><span style="color: #0000BB">1</span><span style="color: #007700">);<br /><br />function </span><span style="color: #0000BB">sum</span><span style="color: #007700">(</span><span style="color: #0000BB">int $a</span><span style="color: #007700">, </span><span style="color: #0000BB">int $b</span><span style="color: #007700">) {<br /> return </span><span style="color: #0000BB">$a </span><span style="color: #007700">+ </span><span style="color: #0000BB">$b</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">sum</span><span style="color: #007700">(</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">sum</span><span style="color: #007700">(</span><span style="color: #0000BB">1.5</span><span style="color: #007700">, </span><span style="color: #0000BB">2.5</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> <div class="example-contents"><p>The above example will output:</p></div> <div class="example-contents screen"> <div class="cdata"><pre> int(3) Fatal error: Uncaught TypeError: Argument 1 passed to sum() must be of the type integer, float given, called in - on line 9 and defined in -:4 Stack trace: #0 -(9): sum(1.5, 2.5) #1 {main} thrown in - on line 4 </pre></div> </div> </div> <div class="example" id="example-147"> <p><strong>Example #11 Weak typing</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">sum</span><span style="color: #007700">(</span><span style="color: #0000BB">int $a</span><span style="color: #007700">, </span><span style="color: #0000BB">int $b</span><span style="color: #007700">) {<br /> return </span><span style="color: #0000BB">$a </span><span style="color: #007700">+ </span><span style="color: #0000BB">$b</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">sum</span><span style="color: #007700">(</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">));<br /><br /></span><span style="color: #FF8000">// These will be coerced to integers: note the output below!<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">sum</span><span style="color: #007700">(</span><span style="color: #0000BB">1.5</span><span style="color: #007700">, </span><span style="color: #0000BB">2.5</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> <div class="example-contents"><p>The above example will output:</p></div> <div class="example-contents screen"> <div class="cdata"><pre> int(3) int(3) </pre></div> </div> </div> <div class="example" id="example-148"> <p><strong>Example #12 Catching <a href="class.typeerror.html" class="classname">TypeError</a></strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #007700">declare(</span><span style="color: #0000BB">strict_types</span><span style="color: #007700">=</span><span style="color: #0000BB">1</span><span style="color: #007700">);<br /><br />function </span><span style="color: #0000BB">sum</span><span style="color: #007700">(</span><span style="color: #0000BB">int $a</span><span style="color: #007700">, </span><span style="color: #0000BB">int $b</span><span style="color: #007700">) {<br /> return </span><span style="color: #0000BB">$a </span><span style="color: #007700">+ </span><span style="color: #0000BB">$b</span><span style="color: #007700">;<br />}<br /><br />try {<br /> </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">sum</span><span style="color: #007700">(</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">));<br /> </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">sum</span><span style="color: #007700">(</span><span style="color: #0000BB">1.5</span><span style="color: #007700">, </span><span style="color: #0000BB">2.5</span><span style="color: #007700">));<br />} catch (</span><span style="color: #0000BB">TypeError $e</span><span style="color: #007700">) {<br /> echo </span><span style="color: #DD0000">'Error: '</span><span style="color: #007700">.</span><span style="color: #0000BB">$e</span><span style="color: #007700">-></span><span style="color: #0000BB">getMessage</span><span style="color: #007700">();<br />}<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> <div class="example-contents"><p>The above example will output:</p></div> <div class="example-contents screen"> <div class="cdata"><pre> int(3) Error: Argument 1 passed to sum() must be of the type integer, float given, called in - on line 10 </pre></div> </div> </div> </div> </div> <div class="sect2" id="functions.variable-arg-list"> <h3 class="title">Variable-length argument lists</h3> <p class="simpara"> PHP has support for variable-length argument lists in user-defined functions. This is implemented using the <em>...</em> token in PHP 5.6 and later, and using the <span class="function"><a href="function.func-num-args.html" class="function">func_num_args()</a></span>, <span class="function"><a href="function.func-get-arg.html" class="function">func_get_arg()</a></span>, and <span class="function"><a href="function.func-get-args.html" class="function">func_get_args()</a></span> functions in PHP 5.5 and earlier. </p> <div class="sect3" id="functions.variable-arg-list.new"> <h4 class="title"><em>...</em> in PHP 5.6+</h4> <p class="para"> In PHP 5.6 and later, argument lists may include the <em>...</em> token to denote that the function accepts a variable number of arguments. The arguments will be passed into the given variable as an array; for example: <div class="example" id="example-149"> <p><strong>Example #13 Using <em>...</em> to access variable arguments</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">sum</span><span style="color: #007700">(...</span><span style="color: #0000BB">$numbers</span><span style="color: #007700">) {<br /> </span><span style="color: #0000BB">$acc </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;<br /> foreach (</span><span style="color: #0000BB">$numbers </span><span style="color: #007700">as </span><span style="color: #0000BB">$n</span><span style="color: #007700">) {<br /> </span><span style="color: #0000BB">$acc </span><span style="color: #007700">+= </span><span style="color: #0000BB">$n</span><span style="color: #007700">;<br /> }<br /> return </span><span style="color: #0000BB">$acc</span><span style="color: #007700">;<br />}<br /><br />echo </span><span style="color: #0000BB">sum</span><span style="color: #007700">(</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #0000BB">3</span><span style="color: #007700">, </span><span style="color: #0000BB">4</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> <div class="example-contents"><p>The above example will output:</p></div> <div class="example-contents screen"> <div class="cdata"><pre> 10 </pre></div> </div> </div> </p> <p class="para"> You can also use <em>...</em> when calling functions to unpack an <span class="type"><a href="language.types.array.html" class="type array">array</a></span> or <a href="class.traversable.html" class="classname">Traversable</a> variable or literal into the argument list: <div class="example" id="example-150"> <p><strong>Example #14 Using <em>...</em> to provide arguments</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">add</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">, </span><span style="color: #0000BB">$b</span><span style="color: #007700">) {<br /> return </span><span style="color: #0000BB">$a </span><span style="color: #007700">+ </span><span style="color: #0000BB">$b</span><span style="color: #007700">;<br />}<br /><br />echo </span><span style="color: #0000BB">add</span><span style="color: #007700">(...[</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">]).</span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= [</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">];<br />echo </span><span style="color: #0000BB">add</span><span style="color: #007700">(...</span><span style="color: #0000BB">$a</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> <div class="example-contents"><p>The above example will output:</p></div> <div class="example-contents screen"> <div class="cdata"><pre> 3 3 </pre></div> </div> </div> </p> <p class="para"> You may specify normal positional arguments before the <em>...</em> token. In this case, only the trailing arguments that don't match a positional argument will be added to the array generated by <em>...</em>. </p> <p class="para"> It is also possible to add a <a href="language.oop5.typehinting.html" class="link">type hint</a> before the <em>...</em> token. If this is present, then all arguments captured by <em>...</em> must be objects of the hinted class. <div class="example" id="example-151"> <p><strong>Example #15 Type hinted variable arguments</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">total_intervals</span><span style="color: #007700">(</span><span style="color: #0000BB">$unit</span><span style="color: #007700">, </span><span style="color: #0000BB">DateInterval </span><span style="color: #007700">...</span><span style="color: #0000BB">$intervals</span><span style="color: #007700">) {<br /> </span><span style="color: #0000BB">$time </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;<br /> foreach (</span><span style="color: #0000BB">$intervals </span><span style="color: #007700">as </span><span style="color: #0000BB">$interval</span><span style="color: #007700">) {<br /> </span><span style="color: #0000BB">$time </span><span style="color: #007700">+= </span><span style="color: #0000BB">$interval</span><span style="color: #007700">-></span><span style="color: #0000BB">$unit</span><span style="color: #007700">;<br /> }<br /> return </span><span style="color: #0000BB">$time</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= new </span><span style="color: #0000BB">DateInterval</span><span style="color: #007700">(</span><span style="color: #DD0000">'P1D'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= new </span><span style="color: #0000BB">DateInterval</span><span style="color: #007700">(</span><span style="color: #DD0000">'P2D'</span><span style="color: #007700">);<br />echo </span><span style="color: #0000BB">total_intervals</span><span style="color: #007700">(</span><span style="color: #DD0000">'d'</span><span style="color: #007700">, </span><span style="color: #0000BB">$a</span><span style="color: #007700">, </span><span style="color: #0000BB">$b</span><span style="color: #007700">).</span><span style="color: #DD0000">' days'</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// This will fail, since null isn't a DateInterval object.<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">total_intervals</span><span style="color: #007700">(</span><span style="color: #DD0000">'d'</span><span style="color: #007700">, </span><span style="color: #0000BB">null</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> <div class="example-contents"><p>The above example will output:</p></div> <div class="example-contents screen"> <div class="cdata"><pre> 3 days Catchable fatal error: Argument 2 passed to total_intervals() must be an instance of DateInterval, null given, called in - on line 14 and defined in - on line 2 </pre></div> </div> </div> </p> <p class="para"> Finally, you may also pass variable arguments <a href="functions.arguments.html#functions.arguments.by-reference" class="link">by reference</a> by prefixing the <em>...</em> with an ampersand (<em>&</em>). </p> </div> <div class="sect3" id="functions.variable-arg-list.old"> <h4 class="title">Older versions of PHP</h4> <p class="para"> No special syntax is required to note that a function is variadic; however access to the function's arguments must use <span class="function"><a href="function.func-num-args.html" class="function">func_num_args()</a></span>, <span class="function"><a href="function.func-get-arg.html" class="function">func_get_arg()</a></span> and <span class="function"><a href="function.func-get-args.html" class="function">func_get_args()</a></span>. </p> <p class="para"> The first example above would be implemented as follows in PHP 5.5 and earlier: <div class="example" id="example-152"> <p><strong>Example #16 Accessing variable arguments in PHP 5.5 and earlier</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">sum</span><span style="color: #007700">() {<br /> </span><span style="color: #0000BB">$acc </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;<br /> foreach (</span><span style="color: #0000BB">func_get_args</span><span style="color: #007700">() as </span><span style="color: #0000BB">$n</span><span style="color: #007700">) {<br /> </span><span style="color: #0000BB">$acc </span><span style="color: #007700">+= </span><span style="color: #0000BB">$n</span><span style="color: #007700">;<br /> }<br /> return </span><span style="color: #0000BB">$acc</span><span style="color: #007700">;<br />}<br /><br />echo </span><span style="color: #0000BB">sum</span><span style="color: #007700">(</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #0000BB">3</span><span style="color: #007700">, </span><span style="color: #0000BB">4</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> <div class="example-contents"><p>The above example will output:</p></div> <div class="example-contents screen"> <div class="cdata"><pre> 10 </pre></div> </div> </div> </p> </div> </div> </div><hr /><div class="manualnavbar" style="text-align: center;"> <div class="prev" style="text-align: left; float: left;"><a href="functions.user-defined.html">User-defined functions</a></div> <div class="next" style="text-align: right; float: right;"><a href="functions.returning-values.html">Returning values</a></div> <div class="up"><a href="language.functions.html">Functions</a></div> <div class="home"><a href="index.html">PHP Manual</a></div> </div></body></html>