php函数入门​

  1. 函数

    function foo($need, $option1=1, $option2=2) {//$option1和option2都是可选参数.
        echo "In foo()<br />\n";
    }
    

  2. 可变函数.

    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()
    

  3. 万物皆有值. 没写↩︎的函数返回的是null.

  4. 闭包(匿名函数).

    $greet = function($name)
    {
        printf("Hello %s\r\n", $name);
    };
    
    $greet('World');
    $greet('PHP');
    

  5. 支持递归, 因此, 我们可以设计迭代函数.

  6. 函数的参数可以传引用, 这样参数就会在函数中进行修改. 比如&$i

    $greet = function(&$name) //这个引用传的没啥意思.
    {
        printf("Hello %s\r\n", $name);
    };
    
    $greet('World');
    $greet('PHP');
    

php函数进一步

php函数的参数, 参考: [http://www.zzphp.net/?p=132]

  1. globe
  2. use
  3. 参数
// 貌似没有参数, 其实有参数. 而且是不定长的. 其实就是参数数组. 还有一种...形式, 是官方推荐的新的形式, 可以去官网看手册.
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常量

  1. 手册这么说: 和使用 define() 来定义常量相反的是,使用 const 关键字定义常量必须处于最顶端的作用区域,因为用此方法是在编译时定义的。这就意味着不能在函数内,循环内以及 if 语句之内用 const 来定义常量。
  2. 但是, 我验证的结果是, define也必须定义在最开头.
  3. 再次验证, define必须在顶部, 定义在文件中间就不行.
  4. 感觉还是和函数作用域是全局的有关. 函数定义, php作为最先会先扫进去, 这个时候, 发现define还没有定义, 虽然define在函数定义之前, 但是, define并不像函数定义那样, 被php优先扫描.
  5. 报错: PHP Notice: Use of undefined constant
  6. 常量定义要早于函数调用, 而不是早于函数调用, 因为没有任何东西是早于函数定义的, 函数定义是最早被扫描的.

php 匿名函数递归

  1. 递归
  2. 用处, 主要用在callback, 和java的匿名类类似啊.
  3. 全匿名函数实现, 互相调用问题. 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); //也可以不组成数组, 直接用::来调用方法.