PHP笔记(上)

引用自:http://www.cnblogs.com/shockerli/p/2000-plus-line-php-notes.html

//语法错误(syntax error)在语法分析阶段,源代码并未被执行,故不会有任何输出。


/* 【命名规则】 */
常量名 类常量建议全大写,单词间用下划线分隔    // MIN_WIDTH
变量名建议用下划线方式分隔            // $var_name
函数名建议用驼峰命名法                // varName
定界符建议全大写                 // <<k;
可变属性  class CLS{public $k = 'hello';} $i = 'k'; $j = new CLS; echo $j->$i;
可变方法  class CLS{public function k(){echo 'hello';}} $i='k'; $j=new CLS; $j->$i();

/* 可变变量 */
* 用于业务逻辑判断得到某些具体信息
    $var_name = "class_name";
    $$var_name = "PHP0913";        // $class_name = "PHP0913";$class_name已存入内存中
    var_dump($class_name);        // var_dump($$var_name);

/* 变量函数 */
get_defined_vars    //返回由所有已定义变量所组成的数组(包括环境变量、服务器变量和用户定义的变量)


/* unset() */
* unset()仅删除当前变量名和引用,其值并未被删除
* 引用传递中,删除一个变量及其引用,其他变量及引用均存在,且值依然存在

     echo "
"; $v3 = '值'; $v4 = &$v3; unset($v4); var_dump($v3, $v4); /* 变量的最长有效期 */ * 当前脚本的执行周期,脚本执行结束,变量即消失 /* 预定义变量/超全局变量 */ $GLOBALS $_COOKIE $_ENV $_FILES $_GET $_POST $_REQUEST $_SERVER $_SESSION /* 常量定义 */ define(常量名, 常量值, [区分大小写参数]) //true表示不区分/false表示区分大小写 const 常量名 = 常量值 // 新,建议 常量名可以使用特殊字符 constant($name) // 获取常量名 // 例:echo constant('-_-'); /* 常量相关函数 */ defined get_defined_constants /* 预定义常量 */ __FILE__ 所在文件的绝对路径 __LINE__ 文件中的当前行号 __DIR__ 文件所在目录 __FUNCTION__ 函数名称 __CLASS__ 类的名称 __METHOD__ 类的方法名 __NAMESPACE__ 当前命名空间的名称 /* 整型 */ 整型占用4字节,共4*8=32位,最大值为2147483647,最小值为-2147483648,最小值的绝对值比最大值的大1 最高为表示正负,1表示负,0表示正 /* 进制转换函数 */ 只能十进制与其他进制进行转换,只有六种 转换时,参数应是字符串(即不可含八进制的“0”或十六进制的“0x”) dec bin oct hex hexdec() 十六进制转十进制 也可写hex2dec() dechex() 十进制转十六进制 也可写dec2hex() bindec() 二进制转十进制 也可写bin2dec() decbin() 十进制转二进制 也可写dex2bin() octdec() 八进制转十进制 也可写oct2dec() decoct() 十进制转八进制 也可写dec2oct() /* 浮点数 */ 浮点数不能比较大小 !!! 几乎所有小数,在保存时都是近似值而不是精确值! 最大值:+/- 1.8E308 PHP所能保存的最长小数位:14位 /* 单引号字符串 */ 单引号字符串中,只能转义反斜杠和单引号 /* 双引号字符串 */ 只解析字符串一次 !!! eval 把字符串作为PHP代码执行 大括号包裹变量,可确定变量名界限。如:"aaa{$bbb}ccc" 双引号中可以将ASCII码转换为字符 "\x61" -> a // 字符串中不需0,整型中才是0x前导 "\x49\x54\x43\x41\x53\x54" -> ITCAST 将ASCII转成字符函数chr() 将字符转成ASCII函数ord() #双引号转义列表 \n 换行 \r 回车 \t 水平制表符 \\ 反斜线 \$ 美元标记 \v 垂直制表符 \e Escape \f 换页 \" 双引号" \[0-7]{1,3} 符合该正则表达式序列的是一个以八进制方式来表达的字符 \x[0-9A-Fa-f]{1,2} 符合该正则表达式序列的是一个以十六进制方式来表达的字符 /* 定界符 */ herodoc - 功能同双引号,能解析 $str = <<" . $x++; $fun and $fun(); }; } $x = "hello world"; $test = closureCreater(); $test(); $test(function(){ echo "closure test one"; }); $test(function(){ echo "closure test two"; }); $test(function() use($x){ echo "
".$x;}); //将函数保存为数组元素 $x = 'outer param.'; $arr = array(); $arr[] = function($str)use($x){ return $str.$x; }; echo $arr[0]('test fun in arr,'); /* 【数组】 */ 关联数组:键和值有关联,键表示值的逻辑含义。 索引数组:键和值无关联,键表示值的位置。通常下标从0开始,递增元素 count($var [,$mode]) //统计数组元素个数 $mode可选,设为1或true时则递归统计 $var非数组,返回1;$var未初始化或等于null或空数组,返回0 //键名的使用 整型数字键不需加引号($arr[1]) 字符串数字键也不需加引号($arr = array('1'=>'abc'); $arr[1]) 关联数组,字符串键需加引号($arr = array('a'=>'aaa'); $arr['a']) 关联数组,双引号中解析变量,可不加引号($arr = array('a'=>'aaa'); "$arr[a]") /* 【指针】 */ current/pos 返回当前被内部指针指向的数组单元的值,并不移动指针。 key 返回数组中当前单元的键名,并不移动指针 next 将数组中的内部指针向前移动一位,并返回移动后当前单元的值。先移动,再取值。 prev 将数组的内部指针倒回一位,并返回移动后当前单元的值先移动,再取值。 end 将数组的内部指针指向最后一个单元,并返回最后一个单元的值 reset 将数组的内部指针指向第一个单元,并返回第一个数组单元的值 each 返回数组中当前的键/值对并将数组指针向前移动一步。 返回的是一个由键和值组成的长度为4的数组,下标0和key表示键,下标1和value表示值 在执行each()之后,数组指针将停留在数组中的下一个单元 或者当碰到数组结尾时停留在最后一个单元。 如果要再用 each 遍历数组,必须使用 reset()。 1. 以上指针操作函数,除了key(),若指针移出数组,则返回false。而key()移出则返回null。 2. 若指针非法,不能进行next/prev操作,能进行reset/end操作 3. current/next/prev 若遇到包含空单元(0或"")也会返回false。而each不会! list 把数组中的值赋给一些变量。list()是语言结构,不是函数 仅能用于数字索引的数组并假定数字索引从0开始 /* 可用于交换多个变量的值 */ list($a, $b) = array($b, $a); 例:list($drink, , $power) = array('coffee', 'brown', 'caffeine'); 1. 复制数组,其指针位置也会被复制。 特例:如果数组指针非法,则拷贝的数组指针会重置,而原数组的指针不变。 【指针问题】 谁第一个进行写操作,就会开辟一个新的值空间。与变量(数组变量)值传递给谁无关。 数组函数current()被定义为写操作,故会出现问题。 foreach遍历的是数组的拷贝,当被写时,才会开辟一个新的值空间。 即,foreach循环体对原数组进行写操作时,才会出现指针问题。 如果开辟新空间时指针非法,则会初始化指针。 2. 如果指针位置出现问题,则reset()初始化一下就可解决。 /* 【遍历数组】 */ * 先找到元素,再获取键和值 foreach foreach (array_expression as [$key =>] & $value) 当foreach开始执行时,数组内部的指针会自动指向第一个单元。 获取元素信息后,移动指针,再执行循环体 1. foreach本身循环结构,break和continue适用于foreach 2. foreach支持循环的替代语法。 3. $value是保存元素值的变量,对其修改不会改变数组的元素值 4. $value支持元素值的引用拷贝,在$value前加上&即可 5. $key不支持引用传递 6. foreach遍历的是原数组的拷贝,而在循环体对数组的操作是操作原数组 即循环体对数组的操作,对原数组生效,对遍历不生效。 先拷贝一份数组用作遍历 while...list...each while (list($key, $val) = mysql_fetch_row($result)) = each($arr) { echo "$key => $val\n"; } /* 【数组函数】 */ //统计计算 count 计算数组中的单元数目或对象中的属性个数 array_count_values 统计数组中所有的值出现的次数 array_product 计算数组中所有值的乘积 array_sum 计算数组中所有值的和 range 建立一个包含指定范围单元的数组 //获取数组内容 array_chunk 将一个数组分割成多个 array array_chunk(array $input, int $size[, bool $preserve_keys]) array_filter 用回调函数过滤数组中的单元 array_slice 从数组中取出一段 array array_slice($arr, $offset [,$len [,$preserve_keys]]) array_keys 返回数组中所有的键名 array array_keys(array $input[, mixed $search_value[, bool $strict]] ) 如果指定了可选参数 search_value,则只返回该值的键名。否则input数组中的所有键名都会被返回。 array_values 返回数组中所有的值,并建立数字索引 array_merge 合并一个或多个数组 一个数组中的值附加在前一个数组的后面。 如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。 如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。 如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引。 array_merge_recursive 递归地合并一个或多个数组 //搜索 in_array 检查数组中是否存在某个值 bool in_array(mixed $needle, array $haystack[, bool $strict]) array_key_exists 检查给定的键名或索引是否存在于数组中 isset()对于数组中为NULL的值不会返回TRUE,而 array_key_exists()会 array_search 在数组中搜索给定的值,如果成功则返回相应的键名 array_combine 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值 如果两个数组的单元数不同或者数组为空时返回FALSE。 array_rand 从数组中随机取出一个或多个单元,返回键名或键名组成的数组,下标是自然排序的 array_fill 用给定的值填充数组 array_fill($start, $num, $value) array_flip 交换数组中的键和值 array_pad 用值将数组填补到指定长度 array_reverse 返回一个单元顺序相反的数组 array_unique 移除数组中重复的值 array_splice 把数组中的一部分去掉并用其它值取代 implode 将数组元素值用某个字符串连接成字符串 explode($delimiter, $str [,$limit]) //使用一个字符串分割另一个字符串 $delimiter不能为空字符串"" array_map 将回调函数作用到给定数组的单元上,只能处理元素值,可以处理多个数组 如果callback参数设为null,则合并多个数组为一个多维数组 array_walk 对数组中的每个成员应用用户函数,只能处理一个数组,键和值均可处理,与foreach功能相同 bool array_walk ( array &$array , callback $funcname [, mixed $userdata ] ) //栈:后进先出 入栈和出栈会重新分配索引下标 array_push 将一个或多个单元压入数组的末尾(入栈) array_pop 将数组最后一个单元弹出(出栈) 使用此函数后会重置(reset())array 指针。 //队列:先进先出 队列函数会重新分配索引下标 array_unshift 在数组开头插入一个或多个单元 array_shift 将数组开头的单元移出数组 使用此函数后会重置(reset())array 指针。 //排序函数 sort 对数组排序 rsort 对数组逆向排序 asort 对数组进行排序并保持索引关系 arsort 对数组进行逆向排序并保持索引关系 ksort 对数组按照键名排序 krsort 对数组按照键名逆向排序 usort 使用用户自定义的比较函数对数组中的值进行排序 uksort 使用用户自定义的比较函数对数组中的键名进行排序 uasort 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联 natsort 用用“自然排序”算法对数组排序 natcasesort 用“自然排序”算法对数组进行不区分大小写字母的排序 array_multisort 对多个数组或多维数组进行排序 shuffle 将数组打乱 引用传递参数,返回bool值。 重新赋予索引键名,删除原有键名 //差集 array_udiff_assoc 带索引检查计算数组的差集,用回调函数比较数据 array_udiff_uassoc 带索引检查计算数组的差集,用回调函数比较数据和索引 array_udiff 用回调函数比较数据来计算数组的差集 array_diff_assoc 带索引检查计算数组的差集 array_diff_key 使用键名比较计算数组的差集 array_diff_uassoc 用用户提供的回调函数做索引检查来计算数组的差集 array_diff_ukey 用回调函数对键名比较计算数组的差集 array_diff 计算数组的差集 //交集 array_intersect_assoc 带索引检查计算数组的交集 array_intersect_key 使用键名比较计算数组的交集 array_intersect_uassoc 带索引检查计算数组的交集,用回调函数比较索引 array_intersect_ukey 用回调函数比较键名来计算数组的交集 array_intersect 计算数组的交集 array_key_exists 用回调函数比较键名来计算数组的交集 array_uintersect_assoc 带索引检查计算数组的交集,用回调函数比较数据 array_uintersect 计算数组的交集,用回调函数比较数据 extract($arr [,$type [,$prefix]]) 从数组中将变量导入到当前的符号表(接受结合数组$arr作为参数并将键名当作变量名,值作为变量的值) compact($var [,...]) 建立一个数组,包括变量名和它们的值(变量名成为键名而变量的内容成为该键的值) /* 【伪类型】 */ mixed 说明一个参数可以接受多种不同的(但并不必须是所有的)类型。 number 说明一个参数可以是 integer 或者 float。 callback 回调函数 void void作为返回类型意味着函数的返回值是无用的。 void作为参数列表意味着函数不接受任何参数。 /* 【数据库操作】 */ #连接认证 mysql_connect 连接并认证数据库 #发送SQL语句,接收执行结果 mysql_query 发送SQL语句 仅对select, show, explain, describe语句执行成功返回一个资源标识符,其他语句成功返回true。执行失败均返回false。 #处理结果 mysql_fetch_assoc 从结果集中取得一行作为关联数组 每次只取回一条,类似each 结果集中记录指针 mysql_fetch_row 从结果集中取得一行作为枚举数组 mysql_fetch_array 从结果集中取得一行作为关联数组,或数字数组,或二者兼有 array mysql_fetch_array ( resource $result [, int $ result_type ] ) 可选参数result_type可选值为:MYSQL_ASSOC,MYSQL_NUM 和 MYSQL_BOTH(默认) mysql_free_result 释放结果内存 #关闭链接 mysql_close 关闭连接 /* 【类和对象】 */ # 成员: 类成员:类常量、静态属性、静态方法 对象成员:非静态属性、非静态方法 # 除此外,类不能包含任何其他东西!!! # 类名、方法名、属性名均不区分大小写 # $this代表本对象,self代表本类,parent代表父类 # 类和函数均可被事先编译(仅作为最外层时) # 类的定义必须在单一的PHP区块内,不能被多个PHP标签分割 // 构造方法 - 具有构造函数的类会在每次创建新对象时先调用此方法 void __construct([ mixed $args [, $... ]] ) - 构造方法所需参数由new实例化对象时,给类增加参数值。 - 构造方法也可以被手动调用。 - 5.3.3版本以前,支持于类名同名的方法作为构造方法。 - 两种冲突时,__construct 优先 // 析构方法 - 析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。 void __destruct( void ) # 作用:释放对象所占用的资源 # 调用的时机 - 脚本结束时所有资源均被释放,包括对象 - 手动删除对象时 - 保存对象的变量被赋予新值时(任何值,包括null) - 在使用exit()终止脚本运行时也会被调用 // 静态成员(static关键字) - 声明类成员或方法为static,就可以不实例化类而直接访问。 - 静态成员(属性或方法)均属于类,故不能通过$this或->访问。 - 静态成员是所有对象共享,属于类。 - 静态成员用类调用,非静态成员用对象调用。 # 静态属性 - 静态属性不可以由对象通过->操作符来访问。 - 静态属性只能被初始化为一个字符值或一个常量,不能使用表达式。 所以你可以把静态属性初始化为整型或数组,但不能指向另一个变量或函数返回值,也不能指向一个对象。 # 静态方法 - 由于静态方法不需要通过对象即可调用,所以伪变量$this在静态方法中不可用。 - 用::方式调用一个非静态方法会导致一个E_STRICT级别的错误。 // 访问解析操作符(::) - 可以用于访问静态成员、方法和常量,还可以用于覆盖类中的成员和方法。 - 当在类的外部访问这些静态成员、方法和常量时,必须使用类的名字。 - self 和 parent 这两个特殊的关键字是用于在类的内部对成员或方法进行访问的。 // 访问辨析 - 对象成员,内部通过$this指定,外部通过对象名指定,均用->访问,访问属性时不需加$。 对象名->属性名 对象名->方法名() $this->属性名 $this->方法名() - 类成员,内部通过self或parent指定,外部通过类名指定,均用::访问,访问属性时需加$。 类名::$属性名 类名::方法名() self::$属性名 self::方法名() - 特殊:也可以通过对象访问类成员。(不建议) 对象名::$类属性名 $this::$类属性名 对象名::$类方法名() $this::类方法名() # 对象成员访问用->,类成员访问用:: - 无论是静态方法还是非静态方法,均可通过类或对象进行访问。 - 静态属性通过类访问,静态方法通过对象访问。 - 只有使用对象调用非静态方法时,$this才可以使用! - 静态方法不可使用$this。 - 类可以调用对象方法,但注意方法内不能有$this。 - 非静态方法可以调用静态属性或静态方法,反之不可以。 // 类常量 - 常量的值将始终保持不变。 - 在定义和使用常量的时候不需要使用$符号。 - 常量的值必须是一个定值,不能是变量,类属性或其它操作(如函数调用)的结果。 # 定义:const 常量名 = 常量值; - 不需要加public等访问修饰限定符 - 类常量属于类,使用类访问,类名::类常量 或 self::类常量 // 自动加载对象 - 在试图使用尚未被定义的类时自动调用 __autoload 函数 - 自动加载使用到的类名文件(根据类名找相应名称的文件,故需类名与类文件名一致) - 每个需要加载类的文件都需要存在__autoload函数 - 将__autoload函数写入单独的文件,每个需要用到类的文件再require该函数文件 - __autoload 参数是类名 function __autoload($class_name) { require_once $_SERVER["DOCUMENT_ROOT"] . "/class/$class_name.php"; } // $_SERVER["DOCUMENT_ROOT"] 当前运行脚本所在的文档根目录 - 可以通过类名,来推导出类所在的文件名! - 如果一个项目存在多个自动加载函数时,定义一个可以完成加载的普通函数,并在函数之前使用spl_autoload_register注册该函数。 # spl_autoload_register - 注册__autoload()函数 bool spl_autoload_register ([ callback $autoload_function ] ) - 可以注册多个自动加载函数,先注册的先执行 - 一旦注册自动加载函数,__autoload就失效。 - 注册函数时,参数为函数名(注意加引号);注册方法时,参数为数组 # 注册类或对象的方法为自动加载方法时,参数需为数组: spl_autoload_register(array(__CLASS__, '__autoload')); __CLASS__表示当前类名,若是对象可用$this,详细见手册 // 序列化(串行化) # 数据传输均是字符串类型 # 除了资源类型,均可序列化 # 序列化在存放数据时,会存放数据本身,也会存放数据类型 作用:1.在网络传输数据时;2.为了将数组或对象放在磁盘时 # 序列化 serialize 产生一个可存储的值的表示 string serialize ( mixed $value ) - 返回字符串,此字符串包含了表示value的字节流,可以存储于任何地方。 - 有利于存储或传递 PHP 的值,同时不丢失其类型和结构。 # 反序列化 unserialize 从已存储的表示中创建PHP的值 mixed unserialize ( string $str [, string $callback ] ) - 对单一的已序列化的变量进行操作,将其转换回PHP的值。 # 文件的读写操作 - file_put_contents 将一个字符串写入文件 int file_put_contents($file, $data [,$flags]) $flags:FILE_USE_INCLUDE_PATH(覆盖),FILE_APPEND(追加) - file_get_contents 将整个文件读入一个字符串 string file_get_contents($file [, bool $use_include_path [,int $offset [,int $maxlen]]]) # 对象序列化 - 只能序列化对象内部的数据,即非静态属性。 # 需在反序列化对象之前加载类,也可以触发自动加载机制。 __sleep 序列化需序列化的属性。 - 提交未提交的数据,或类似的清理操作,部分串行化对象。 - 返回一个包含对象中所有应被序列化的变量名称的数组 __wakeup 反序列化时,预先准备对象需要的资源 - 重新建立数据库连接,或执行其它初始化操作 public function __sleep() { return array('server', 'username', 'password', 'db'); } public function __wakeup() { $this->connect(); } // 对象继承 class 子类名 extends 父类 {} 如果一个对象是子类的对象,那么同时也是父类的对象。 单继承:一个类只能继承一个父类,不能同时继承多个类。但一个父类可以被多个子类继承。 instanceof 判断某对象是否为某类的对象 对象名 instanceof 类名 // 访问控制 public 公有的(继承链、本类、外部均可访问) protected 保护的(仅继承链、本类可访问) private 私有的(仅本类可访问) 根据成员定义位置、访问位置判断。 # 兼容性问题 - 声明属性时,var关键字声明的默认为public权限 - 声明方法时,省略访问修饰符,默认为public权限 // 重写 override $this代表本对象,被谁调用,就代表哪个对象。 - 继承时,子类成员名于父类成员名发生冲突,则子类成员会重写父类成员。 - 属性和方法均可被子类重写。 - 当父类的方法或属性已经不满足子类的需求,则需要重写。 - 也可能因为命名不规范导致重写。 私有属性不能被重写,每个私有属性都会被记录。在记录属性名的同时,还会记录类。 如果有内置函数被重写,则可调用父类方法。如调用父类构造方法parent::__construct() # 重写限制 访问限制: 子类的成员的访问控制必须相等或弱于父类。 方法参数限制: 参数数量必须相同,参数名可不同。 # $this确定原则 $this为调用该方法的对象,表示该方法的执行环境对象。 - 对象调用 - 环境的传递。如果当前调用时,不能确定$this的值(静态调用),此时静态调用所处对象环境会传递到被调用的方法内。 $this并非永远代表本对象,而是由方法的执行环境决定。 # final 如果父类中的方法被声明为final,则子类无法覆盖(重写)该方法。 如果一个类被声明为final,则不能被继承。 但加有final关键字的类依旧能被实例化! # 抽象类 关键字:abstract 抽象类不能直接被实例化,必须先继承该抽象类,然后再实例化子类。 抽象类中至少要包含一个抽象方法。非抽象类不能包含抽象方法。 如果类方法被声明为抽象的,那么其中就不能包括具体的功能实现。抽象方法不能包含大括号及方法体。 继承一个抽象类的时候,子类必须实现抽象类中的所有抽象方法。 即,子类必须重写抽象父类中的所有抽象方法。 另外,这些方法的可见性必须和抽象类中一样(或者更为宽松)。 即,如果抽象类中某个抽象方法被声明为protected,那么子类中实现的方法就应该声明为protected或者public,而不能定义为private。 - 抽象类的子类中的普通方法执行方式和其他类相同。 - 作用: 1. 继承,为扩展类,统一公共操作。 2. 限制结构(规范)。规范子类的结构。 // 接口 关键字:interface - 对象提供的与对象交互的方式就是接口。 - 使用接口可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。 - 通过interface来定义一个接口,就像定义一个标准的类一样,但其中定义所有的方法都是空的。 - 接口中定义的所有属性和方法都必须是public,可省略public关键字。 - 接口中也可以定义常量(const)。接口常量和类常量的使用完全相同。 可以用::访问。接口名::常量名,实现类::常量名。 它们都是定值,可以被子类或子接口使用,但不能修改。 - 接口不能定义属性! # 定义接口 interface 接口名 { 接口内容(公共方法声明的集合) } # 接口实现 - 要实现一个接口,可以使用implements操作符。 - 类中必须实现接口中定义的所有方法,否则会报一个fatal错误。 - 如果要实现多个接口,可以用逗号来分隔多个接口的名称。 - 实现多个接口时,接口中的方法不能有重名。 - 接口也可以继承,通过使用extends操作符。 class 类名 implements 接口名 { 接口方法的实现 } # 注意 1. 类与抽象类之间是继承关系,类与接口之间是实现关系。 2. 类与抽象类是单继承,类与接口是多实现。 3. 接口不是类,限制类的结构。 4. 接口与接口之间是多继承。用extends关键字。 interface I_C extends I_A, I_B {} // 静态延迟绑定 self::,代表本类(当前代码所在类) 永远代表本类,因为在类编译时已经被确定。 即,子类调用父类方法,self却不代表调用的子类。 static::,代表本类(调用该方法的类) 用于在继承范围内引用静态调用的类。 运行时,才确定代表的类。 static::不再被解析为定义当前方法所在的类,而是在实际运行时计算的。 // 对象的遍历(迭代) - 对象通过属性保存数据,故遍历对象的属性。 - foreach语言结构,获得属性名和属性值。 foreach ($obj as $p_name => $p_value) {} # 自定义遍历(迭代器Iterator) Iterator - 可在内部迭代自己的外部迭代器或类的接口 Iterator::current — 返回当前元素 Iterator::key — 返回当前元素的键 Iterator::next — 向前移动到下一个元素 Iterator::rewind — 返回到迭代器的第一个元素 Iterator::valid — 检查当前位置是否有效 # 对象的克隆 //对象之间的传值是[引用]传递。 克隆:新对象 = clone 旧对象 - 所有的引用属性仍然会是一个指向原来的变量的引用。 __clone()方法在对象被克隆时自动调用。 注意:构造方法对应实例化(new),克隆方法对应克隆(clone)。 // 单例模式 #三私一公 单例模式(Singleton)用于为一个类生成一个唯一的对象。最常用的地方是数据库连接。使用单例模式生成一个对象后,该对象可以被其它众多对象所使用。 # 防止一个类被实例化多次 class MySQLDB { private static $instance = null; // 存类实例在此属性中 // 构造方法声明为private,防止直接创建对象 private function __construct() {} public static function getInstance() { if(! self::$instance instanceof static) { self::$instance = new static; } return self::$instance; } private function __clone() {} // 阻止用户复制对象实例 } // 魔术方法 __construct 构造方法 __destruct 析构方法 __clone 克隆对象 __sleep 序列化对象 __wakeup 反序列化对象 __autoload 自动加载,使用类但未找到时 __toString 对象被当作字符串使用时 __invoke 当尝试以调用函数的方式调用一个对象时 # 重载 overload 指动态地"创建"类属性和方法 用户可以自由的为对象添加额外的属性,该特性就是重载。 所有的重载方法都必须被声明为public。 当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用。 重载相关魔术方法的参数都不能通过引用传递。 # 属性重载 - 处理不可访问的属性 属性重载只能在对象中进行。 # 属性重载对于静态属性无效 在静态方法中,这些魔术方法将不会被调用。所以这些方法都不能被声明为static。 __set 在给不可访问的属性赋值时 public void __set(string $name, mixed $value) 作用:批量管理私有属性,间接保护对象结构 __get 读取不可访问的属性的值时 public mixed __get(string $name) __isset 当对不可访问的属性调用isset()或empty()时 public bool __isset(string $name) __unset 当对不可访问的属性调用unset()时 public void __unset(string $name) # 方法重载 - 处理不可访问的方法 __call 当调用一个不可访问的非静态方法(如未定义,或者不可见)时自动被调用 public mixed __call(string $name, array $arguments) __callStatic 当在调用一个不可访问的静态方法(如未定义,或者不可见)时自动被调用 public static mixed __callStatic(string $name, array $arguments) # $name参数是要调用的方法名称。$arguments参数是一个数组,包含着要传递给方法的参数。 // 类型约束 函数的参数可以指定只能为对象或数组 限定为对象则在形参前加类名,限定为数组则在形参前加array 类型约束允许NULL值 类型约束不只是用在类的成员方法里,也能使用在函数里。 // 三大特性 封装:隐藏内部是吸纳,仅开发接口。 继承:一个对象的成员被另一个对象所使用。语法上体现为代码的共用。 多态:多种形态。 // 类与对象·关键字 this 代表本对象 public 公有的(继承链、本类、外部均可访问) protected 保护的(仅继承链、本类可访问) private 私有的(仅本类可访问) parent:: 代表父类 self:: 代表本类(当前代码所在类) static:: 代表本类(调用该方法的类) static 静态成员(属性、方法),所有对象均可使用,外部也可直接使用或修改,静态方法不可访问非静态成员 final 方法用final不可被子类重载,类用final不可被继承(方法、类) const 类常量(属性) abstract 抽象类 interface 接口 extends 类继承(子接口继承接口、其他普通类继承) implements 接口实现(类实现接口、抽象类实现借口)(对接口的实现和继承均可有多个) Iterator 内置接口(迭代) clone 克隆 instance 实例 instanceof 某对象是否属于某类 /* 【类与对象相关函数】 */ class_alias([$original [,$alias]]) 给类取别名 class_exists($class [,$autoload]) 检查类是否已定义 interface_exists($interface [,$autoload]) 检查接口是否已被定义 method_exists($obj, $method)检查类的方法是否存在 property_exists($class, $property) 检查对象或类是否具有该属性 get_declared_classes(void) 返回由已定义类的名字所组成的数组 get_declared_interfaces(void) 返回一个数组包含所有已声明的接口 get_class([$obj]) 返回对象的类名 get_parent_class([$obj]) 返回对象或类的父类名 get_class_methods($class) 返回由类的方法名组成的数组 get_object_vars($obj) 返回由对象属性组成的关联数组 get_class_vars($class) 返回由类的默认属性组成的数组 is_a($obj, $class) 如果对象属于该类或该类是此对象的父类则返回TRUE is_subclass_of($obj, $class) 如果此对象是该类的子类,则返回TRUE get_object_vars($obj) 返回由对象属性组成的关联数组

你可能感兴趣的:(PHP笔记(上))