凌的博客

您现在的位置是: 首页 > 学无止境 > PHP > 

PHP

PHP笔记 (一)

2015-12-29 PHP 514
//语法错误(syntax error)在语法分析阶段,源代码并未被执行,故不会有任何输出。 /* 【命名规则】 */ 常量名 类常量建议全大写,单词间用下划线分隔 // MIN_WIDTH 变量名建议用下划线方式分隔 // $var_
//语法错误(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
 
 
/* 预定义常量 */
ql_FILE      所在文件的绝对路径
ql_LINE      文件中的当前行号
ql_DIR      文件所在目录
ql_FUNCTION    函数名称
ql_CLASS      类的名称
ql_METHOD    类的方法名
ql_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 = <<'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(ql_CLASS, '__autoload'));
ql_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)  返回由对象属性组成的关联数组

文章评论

0条评论