1. Solve the scope problem
In the previous section, we talked about the scope of functions in PHP. If classes are not enough to explain the problem, then the scope examples in this article may be more convincing to you.
So, how can we access external variables in PHP functions?
In PHP, there is a concept called global scope, that is, if you do not use functions (there will be the concept of classes in the future), then the variables you create can be accessed anywhere on the page. So, how do we solve the problem in the function body?
We can use the global keyword:
<span style="COLOR: blue"><?</SPAN><SPAN style="COLOR: maroon">php </SPAN>$<SPAN style="COLOR: red">name</SPAN><SPAN style="COLOR: blue">="kym"</SPAN>; <SPAN style="COLOR: red">function Test</SPAN>() { <SPAN style="COLOR: red">global </SPAN>$<SPAN style="COLOR: red">name</SPAN>; <SPAN style="COLOR: red">echo</SPAN>($<SPAN style="COLOR: red">name</SPAN>); } <SPAN style="COLOR: red">Test</SPAN>(); <SPAN style="COLOR: blue">?> </span>
In this case, we are equivalent to getting a reference to the global variable $name without having to re-create a $name variable.
There is a saying in the PHP manual: Using global variables is equivalent to creating a reference to the variable in the $GLOBALS variable. Then we can imitate this semantics and write code like this:
<span style="COLOR: blue"><?</SPAN><SPAN style="COLOR: maroon">php </SPAN>$<SPAN style="COLOR: red">name</SPAN><SPAN style="COLOR: blue">="kym"</SPAN>; <SPAN style="COLOR: red">function Test</SPAN>() { $<SPAN style="COLOR: red">temp</SPAN><SPAN style="COLOR: blue">=&$GLOBALS["</SPAN><SPAN style="COLOR: red">name</SPAN><SPAN style="COLOR: blue">"]; echo($temp); } Test(); ?> </span>
In fact, these two are equivalent codes. It seems that using variables in this way is troublesome, but this actually avoids many side effects. For example, Java and C# are object-oriented languages, but in PHP, everything is on one page or even multiple pages. If you don’t use this This method can easily produce side effects (accidental modification) of the function.
2. Default parameters
The first time I heard this concept was probably in C++. After I learned C#, I have never been exposed to this concept, but I still like this feature very much.
This eliminates the need to write a bunch of troublesome overloaded functions for a function.
Write the simplest example:
<span style="COLOR: blue"><?</SPAN><SPAN style="COLOR: maroon">php </SPAN><SPAN style="COLOR: red">function Test</SPAN>($<SPAN style="COLOR: red">name</SPAN><SPAN style="COLOR: blue">="kym"</SPAN>) { <SPAN style="COLOR: red">echo</SPAN>($<SPAN style="COLOR: red">name</SPAN>); } <SPAN style="COLOR: red">Test</SPAN>(); <SPAN style="COLOR: red">Test</SPAN>(<SPAN style="COLOR: blue">"others"</SPAN>); <SPAN style="COLOR: blue">?> </span>
Isn’t it necessary to write an overloaded function?
But there are two points to note here:
A. When setting default values for parameters, only the simplest constants can be set, and complex expressions cannot be included.
B. Parameters that require default values must be placed at the end. This is similar to variable parameters in C#.
3. Variable parameters
In C#, there is such a concept called variable parameters. Let’s write a simple example:
<span style="COLOR: blue">protected void </span>LinkButton1_Click(<span style="COLOR: blue">object </span>sender, <span style="COLOR: #2b91af">EventArgs </span>e) { Response.Write(GetSum(1, 2, 3, 4, 5)); } <span style="COLOR: blue">public int </span>GetSum(<span style="COLOR: blue">params int</span>[] elements) { <span style="COLOR: blue">int </span>sum = 0; <span style="COLOR: blue">for </span>(<span style="COLOR: blue">int </span>i = 0; i < elements.Length; i++) { sum += elements[i]; } <SPAN style="COLOR: blue">return </SPAN>sum; }
Before writing examples, let me first introduce three functions related to variable parameters.
func_get_args() returns an array of all parameters of the function
func_get_arg() returns a specific argument from parameters
func_num_args() returns the number of parameters.
Okay, then let’s write a PHP version corresponding to the C# version.
<SPAN style="COLOR: blue"><?</SPAN><SPAN style="COLOR: maroon">php </SPAN><SPAN style="COLOR: red">function GetSum</SPAN>() { <SPAN style="COLOR: red">if</SPAN>(<SPAN style="COLOR: red">func_num_args</SPAN>()<SPAN style="COLOR: blue">=</SPAN>=0) { <SPAN style="COLOR: red">return </SPAN>0; } $<SPAN style="COLOR: red">sum</SPAN><SPAN style="COLOR: blue">=0; </SPAN><SPAN style="COLOR: red">for</SPAN>($<SPAN style="COLOR: red">i</SPAN><SPAN style="COLOR: blue">=0;$i<</SPAN><SPAN style="COLOR: maroon">func_num_args</SPAN>();$<SPAN style="COLOR: red">i</SPAN>++) { $<SPAN style="COLOR: red">sum</SPAN>+<SPAN style="COLOR: blue">=func_get_arg($i); </SPAN>} <SPAN style="COLOR: red">return </SPAN>$<SPAN style="COLOR: red">sum</SPAN>; } <SPAN style="COLOR: red">echo</SPAN>(<SPAN style="COLOR: red">GetSum</SPAN>(1,2,3,4)); ?<SPAN style="COLOR: blue">>
4. Variable function
I don’t know why it needs to be translated into this name. It actually calls the corresponding function based on the name of the variable.
is very similar to this eval in JS, as shown below:
<span style="COLOR: teal"><</SPAN><SPAN style="COLOR: #3f7f7f">script</SPAN><SPAN style="COLOR: teal">> </span><span style="COLOR: #7f0055">function </span>Execute(functionName) { eval(functionName+<span style="COLOR: #2a00ff">"()"</span>); } <span style="COLOR: #7f0055">function </span>Test() { alert(<span style="COLOR: #2a00ff">"111"</span>); } Execute(<span style="COLOR: #2a00ff">"Test"</span>); <span style="COLOR: teal"></</SPAN><SPAN style="COLOR: #3f7f7f">script</SPAN><SPAN style="COLOR: teal">></span>
This is to pass in a function name and then execute the corresponding function. Well, in PHP, it's actually the same, and it's simpler.
<span style="COLOR: red"><?php </SPAN><SPAN style="COLOR: blue">function </SPAN>Test(<SPAN style="COLOR: #660000">$func</SPAN>) { <SPAN style="COLOR: #660000">$func</SPAN>(); } <SPAN style="COLOR: blue">function </SPAN>First(){<SPAN style="COLOR: blue">echo</SPAN>(<SPAN style="COLOR: #008200">"first"</SPAN>);} Test(<SPAN style="COLOR: #008200">"First"</SPAN>); <SPAN style="COLOR: red">?></span>