Php函数和他的参数
php函数入门
-
函数
function foo($need, $option1=1, $option2=2) {//$option1和option2都是可选参数. echo "In foo()<br />\n"; }
-
可变函数.
function foo() { echo "In foo()<br />\n"; } $c = 'foo'; $c(); // This calls foo() class Foo { function Variable() { $name = 'Bar'; $this->$name(); // This calls the Bar() method } function Bar() { echo "This is Bar"; } } $o = new Foo(); $funcname = "Variable"; $o->$funcname(); // This calls $foo->Variable()
-
万物皆有值. 没写↩︎的函数返回的是null.
-
闭包(匿名函数).
$greet = function($name) { printf("Hello %s\r\n", $name); }; $greet('World'); $greet('PHP');
-
支持递归, 因此, 我们可以设计迭代函数.
-
函数的参数可以传引用, 这样参数就会在函数中进行修改. 比如&$i
$greet = function(&$name) //这个引用传的没啥意思. { printf("Hello %s\r\n", $name); }; $greet('World'); $greet('PHP');
php函数进一步
php函数的参数, 参考: [http://www.zzphp.net/?p=132]
- globe
- use
- 参数
// 貌似没有参数, 其实有参数. 而且是不定长的. 其实就是参数数组. 还有一种...形式, 是官方推荐的新的形式, 可以去官网看手册.
function sum() {
$acc = 0;
foreach (func_get_args() as $n) { //这个函数就是拿到参数的函数.
$acc += $n;
}
return $acc;
}
//闭包函数
$greet = function($name){
printf("Hello %s\r\n", $name);
};
$greet('World');
$greet('PHP');
//use关键字
$callback =function ($quantity, $product) use ($tax, &$total){ //use关键字在这里
$pricePerItem = constant(__CLASS__ . "::PRICE_" .
strtoupper($product));
$total += ($pricePerItem * $quantity) * ($tax + 1.0);
};
闭包匿名函数配合use, 本身没啥问题, 但是, 有一个问题, 作用域从函数作用域改为了变量作用域, 因此这一套要在使用前定义.
这样的话, 貌似define 常量更合理, 但是, define的语法是在是无法忍受. 而且常量是全局的, 偶滴神啊.
php常量
- 手册这么说: 和使用 define() 来定义常量相反的是,使用 const 关键字定义常量必须处于最顶端的作用区域,因为用此方法是在编译时定义的。这就意味着不能在函数内,循环内以及 if 语句之内用 const 来定义常量。
- 但是, 我验证的结果是, define也必须定义在最开头.
- 再次验证, define必须在顶部, 定义在文件中间就不行.
- 感觉还是和函数作用域是全局的有关. 函数定义, php作为最先会先扫进去, 这个时候, 发现define还没有定义, 虽然define在函数定义之前, 但是, define并不像函数定义那样, 被php优先扫描.
- 报错: PHP Notice: Use of undefined constant
- 常量定义要早于函数调用, 而不是早于函数调用, 因为没有任何东西是早于函数定义的, 函数定义是最早被扫描的.
php 匿名函数递归
- 递归
- 用处, 主要用在callback, 和java的匿名类类似啊.
- 全匿名函数实现, 互相调用问题. A use B, B use A.
```php
$test = function ($a) use (&$test) {
…
}
$factorial = function( $n ) use ( &$factorial ) {#递归了
if( $n == 1 ) return 1;
return $factorial( $n - 1 ) * $n;
};
print $factorial( 5 );
$a = function($n) use (&$b){
return $b(1);
};
$b = function($n)use ( &$a){
return $a(1);
};
#因为是引用, 因此, 在调用函数时, 这个变量存在就可以了.
#但是, 其实导致了一个结果, 如果使用了匿名函数, 那么相关的函数必须也是匿名函数才行.
### callback, 三种传递todo
1. 函数名字符串
2. create_function_ 这个函数会形成一个函数
3. 匿名函数, 实际是Closure类实例?
```php
<?php
//参考: http://www.jianshu.com/p/a697aa6f166e
echo add(1,2);// 函数可以在定义之前调用.
echo "\n";
function add($a,$b){
return $a+$b;
}
$var="add";
echo $var(4,2);
echo "\n";
//传函数名为参数的示例:
$arr=array(2,3,5,4,1,6,7,9,8);
function myrule($a,$b){
if ($a>$b){
return 1;
} elseif ($a<$b){
return -1;
} else{
return 0;
}
}
usort($arr,"myrule"); //函数名作为字符串传入.
var_dump($arr);
//call_user_func_array("demo",array(1,3));
//他有两个参数分别是回调函数名称,以及参数数组
//其优点在于array中的参数的数量可以不固定,比如有默认缺省参数的时候。
//rule1除去数组中是三的倍数的数
function rule1($a){
if ($a%3==0){
return true;
}else{
return false;
}
}
//rule2是除去数组中的回文数(从左边读与从右边读是一样的)
function rule2($a){
if ($a==strrev($a)){
return true;
}else{
return false;
}
}
function demo($n,$var){
for ($i=0;$i<$n;$i++){
if (call_user_func_array($var,array($i))) {
continue;
}else{
echo $i." ";
}
}
}
$var="rule1";
demo(100,$var);
echo "\n", "<hr>\n";
$var="rule2";
demo(200,$var);
echo "\n";
//对于对象
class A{
function one(){
}
static function two(){
}
}
demo(200,array(new A,"one")); //new一个对象去调用方法one
demo(200,array("A","two")); //直接从类的角度调用方法two.
call_user_func("MyClass::myUrlencode",$str); //也可以不组成数组, 直接用::来调用方法.