函数
2022年9月29日大约 4 分钟
函数
变量作用域
<?php
$a = 1; /* global scope */
function Test()
{
echo $a; /* reference to local scope variable */
}
Test();
//这个脚本不会有任何输出,因为 echo 语句引用了一个局部版本的变量 $a,而且在这个范围内,它并没有被赋值。
$var1 = 1;
$var2 = 2;
function test1(){
$GLOBALS['var2'] = &$GLOBALS['var1'];
}
test1();
echo $var2 . PHP_EOL;
$var3 = 1;
$var4 = 2;
function test2(){
global $var3,$var4;
$var4 = $var3;
}
test2();
echo $var4 . PHP_EOL;
// 1 1
注意:不能在用global声明变量的同时给变量赋值 像global $name = "why"的使用方式是错误的。
静态变量
function Test()
{
$a = 0;
echo $a;
$a++;
}
Test();
//每次调用Test时都会将 $a 的值设为 0 并输出 0。将变量加一的 $a++ 没有作用,因为一旦退出本函数则变量 $a 就不存在了
function test()
{
static $a = 0;
echo $a;
$a++;
}
//变量 $a 仅在第一次调用 test() 函数时被初始化,之后每次调用 test() 函数都会输出 $a 的值并加一
// 静态变量也提供了一种处理递归函数的方法。递归函数是一种调用自己的函数。写递归函数时要小心,因为可能会无穷递归下去。必须确保有充分的方法来中止递归。以下这个简单的函数递归计数到 10,使用静态变量 $count 来判断何时停止:
function test()
{
static $count = 0;
$count++;
echo $count;
if ($count < 10) {
test();
}
$count--;
}
函数参数
默认情况下,函数参数通过值传递
如果希望允许函数修改它的值,必须通过引用传递参数
$a = 1;
function fun(&$a)
{
$a = 2;
}
fun();
echo $a; //2
函数的引用返回
从函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用运算符&
function &myFunc()
{
static $b = 10;
return $b;
}
echo myFunc(); // 10
$a = &myFunc();
$a = 100;
echo myFunc(); // 100
PHP遍历指定目录下所有文件
function get_all_file($path){
$files = array();
if(is_dir($path)){
if($handle = opendir($path)){
while($file = readdir($handle)){
if($file!='.' && $file!='..'){
$child_path = $path.'/'.$file;
if(is_dir($child_path)){
$files[$file] = get_all_file($child_path);
}else{
$files[] = $child_path;
}
}
}
}
closedir($handle);
return $files;
}
}
$path = "f:";
//echo "<pre>";
//print_r(get_all_file($path));
PHP 中几个输出函数 echo, print(), print_r(), sprintf(), var_dump()的区别
1: echo:是询句不是函数,没有迒回值,可输出多个变量值,不需要囿括号。不能输出数
组和对象,叧能打印简单类型 (如 int,string)。
2: print:是询句不是函数,有迒回值 1 ,叧能输出一个变量,不需要囿括号。不能输出
数组和对象,叧能打印简单类型 (如 int,string)。
3: print_r:是函数,可以打印复吅类型,例如: stirng、 int、 float、 array、 object 等,
输出 array 时会用结构表示,而丏可以通过 print_r($str,true)来使 print_r 不输出而迒回
print_r 处理后的值
4: printf:是函数,把文字格式化以后输出(参看 C 询觊)
5: sprintf:是函数,跟 printf 相似,但不打印,而是迒回格式化后的文字(诠函数把格式
化的字符串写写入一个变量中,而不是输出来),其 他的不 printf 一样。
例如:
$str = "Hello";
$number = 123;
$txt = sprintf("%s world. Day number %u",$str,$number);
//输出: Hello world. Day number 123
6: var_dump():函数,输出变量的内容、类型戒字符串的内容、类型、长度。常用来调试。
可以通过 function_exists('函数名称 ')进行测试
var_dump(function_exists('echo')); //bool(false)
var_dump(function_exists('print')); //bool(false)
var_dump(function_exists('print_r')); //bool(true)
var_dump(function_exists('printf')); //bool(true)
var_dump(function_exists('sprintf')); //bool(true)
var_dump(function_exists('var_dump')); //bool(true)
如何实现链式操作 $obj->w()->m()->d();
简单实现(关键通过做完操作后return $this;)
class Sql{
private $sql=array("from"=>"",
"where"=>"",
"order"=>"",
"limit"=>"");
public function from($tableName) {
$this->sql["from"]="FROM ".$tableName;
return $this;
}
public function where($_where='1=1') {
$this->sql["where"]="WHERE ".$_where;
return $this;
}
public function order($_order='id DESC') {
$this->sql["order"]="ORDER BY ".$_order;
return $this;
}
public function limit($_limit='30') {
$this->sql["limit"]="LIMIT 0,".$_limit;
return $this;
}
public function select($_select='*') {
return "SELECT ".$_select." ".(implode(" ",$this->sql));
}
}
$sql =new Sql();
echo $sql->from("testTable")->where("id=1")->order("id DESC")->limit(10)->select();
//输出 SELECT * FROM testTable WHERE id=1 ORDER BY id DESC LIMIT 0,10
//利用__call()方法实现
class String
{
public $value;
public function __construct($str=null)
{
$this->value = $str;
}
public function __call($name, $args)
{
$this->value = call_user_func($name, $this->value, $args[0]);
return $this;
}
public function strlen()
{
return strlen($this->value);
}
}
$str = new String('01389');
echo $str->trim('0')->strlen();
// 输出结果为 4;trim('0')后$str为"1389"