<code><?php /* * 回顾 * php 魔术方法 * __<span>set</span>() 当在类外使用类的private 属性时,或不存在的属性时会报错,如果设置了__<span>set</span>()方法,那么就会调用这个方法 * __<span>set</span>(成员属性名名称,要设置的成员属性的值) * __get() 当在类外获取类的private 属性时,属性时,或不存在的属性时会报错, 如果设置了__get()方法,那么就会调用这个方法 * __get(成员属性的名称) * __call() 当调用类的不存在的方法时,会报错,若定义了改方法,那么就调用此方法 * __call(被调用的方法名,该方法的参数) * __callStatic(被调用的方法名,该方法的参数) * __clone() 当<strong>对象</strong>克隆时调用该方法 * __clone(),默认参数为<span>$this</span>,<span>$that</span>, <span>$this</span> 为要克隆出的<strong>对象</strong>,<span>$that</span>为原<strong>对象</strong> * __construct 构造函数 * __destruct 析构函数 * __sleep(); 当<strong>对象</strong>序列化之前被调用 * __wakeup()当反序列化之前调用 * __autoload(被包含的类名) 当调用一个类名的方法时,如果没有将该类包含进来, 则会报错,当定义了此函数时,就会调用此函数动态加载类文件 __toString() 当直接输出类的<strong>对象</strong>时会报错,如果定义的该方法,则调用此方法 * */ class A { private <span>$name</span>; private <span>$age</span>; public function __construct(<span>$name</span>,<span>$age</span>){ <span>$this</span>->name = <span>$name</span>; <span>$this</span>->age = <span>$age</span>; } public function __<span>set</span>(<span>$name</span>,<span>$value</span>){ <span>$this</span>-><span>$name</span> = <span>$value</span>; } public function __get(<span>$name</span>){ <span>if</span>(<span>$name</span>==<span>'fuck'</span>) <span>return</span><span>"fuck!"</span>; <span>if</span>(isset(<span>$this</span>-><span>$name</span>)){ <span>return</span><span>$this</span>->name; }<span>else</span>{ <span>return</span> NULL; } } public function __call(<span>$name</span>,<span>$args</span>){ <span>echo</span><span>$name</span> ,<span>"Mothod不存在"</span>; var_dump(<span>$args</span>); } public static function __callStatic(<span>$name</span>,<span>$value</span>){ <span>echo</span><span>"<strong>静态方法</strong><span>$name</span>不存在"</span>; } public function <span><span>__clone</span></span>() { <span>$this</span>->name = <span>"我是被克隆的"</span>; } public function <span><span>__sleep</span></span>() { // <span>echo</span><span>"正在被序列化"</span>; <span>return</span> array(name); } //重新生成<strong>对象</strong>时,调用 public function <span><span>__wakeup</span></span>() { <span>$this</span>->name = <span>"张三"</span>; <span>$this</span>->age = <span>234</span>; } public function <span><span>__toString</span></span>() { <span>return</span><span>"A"</span>; } } //<span>$a</span> = new A(<span>"张三"</span>,<span>22</span>); //<span>echo</span><span>$a</span>->name; //<span>$a</span>->name = <span>"张三"</span>; //<span>echo</span><span>$a</span>->name; //<span>$a</span>->get(<span>"xue"</span>,<span>3</span>,<span>"sf"</span>) ; //<span>$a1</span> = clone <span>$a</span>; //<span>echo</span><span>$a</span>->name,<span>"<br/>"</span>,<span>$a1</span>->name; //<span>$p_str</span> = serialize(<span>$a</span>); //<span>echo</span><span>$p_str</span>; //<span>$a2</span> = unserialize(<span>$p_str</span>); //var_dump(<span>$a2</span>); //function __autoload(<span>$classname</span>){ // <strong>include</strong> <span>$classname</span>.<span>".php"</span>; //} //<span>echo</span><span>$a2</span>->fuck; //A::ha(); /* * <span>1</span>. <span>echo</span> 和print 的区别 * <span>echo</span> 是语句,不是函数, 不用括号,可以输出多个值,没有返回值,不能输出数组和<strong>对象</strong> 只能输出简单的类型,如 int,string * print 是语句,不是函数,不用括号,只能输出一个值,有返回值<span>1</span>,不能输出数组和<strong>对象</strong>,只能输出简单的类型,如int,string * <span>2</span>.print_r() 和 var_dump() * print_r() 是函数,可以输出复合类型和简单类型,如int float ,string ,array object,当输出<strong>对象</strong>时以机构表示如 Object{},当输出 * 数组时表示为Array() * var_dump() 是函数,输出变量的内容,类型,长度,可以输出简单类型,复合类型,常用来调试 * <span>3</span>.printf 是函数,类似C语言,格式化字符串输出 * <span>4</span>.sprintf 函数,类似C语言,格式化字符串后返回一个格式化后的字符串不输出 * */ //print_r(<span>3.55</span>); //<span>$arr</span> = array(<span>"xue"</span>,<span>3</span>); // print_r(<span>$arr</span>); // var_dump(<span>$arr</span>); //<span>$nb</span> = sprintf(<span>"%s 是个%d吊"</span>,<span>"haha"</span>,<span>3</span>); //<span>echo</span><span>$nb</span>; /* * 获取文件内容方式 * <span>1</span>.file_get_contents(); * */ //<span>$txt</span> = file_get_contents(<span>'data.txt'</span>); //<span>echo</span><span>$txt</span>; //<span>$file</span> = fopen(<span>"data.txt"</span>,<span>"r"</span>); //<span>while</span>(!feof(<span>$file</span>)){ // <span>$line</span> = fgets(<span>$file</span>); // // <span>echo</span><span>$line</span>; // //} //<span>while</span>(!feof(<span>$file</span>)){ // <span>$char</span> = fgetc(<span>$file</span>); // <span>echo</span><span>$char</span>; //} /* * strlen() he mb_strlen的区别 * 两者都是求字符串长度的函数 * 在strlen只是获得字符串所占的字节数,无法正确处理中文字符 * 当为GB2313编码时,一个汉字占<span>2</span>位,当为UTF-<span>8</span>编码时,一个汉字占<span>3</span>位 * mb_strlen()能够正确处理汉字,第二个参数为编码的类型,默认为UTF-<span>8</span>,默认为PHP内部的编码,可以用mb_internal_encoding()来查看 * mb_strlen()并不是php核心函数, 需要加载扩展库来使用,在php.in中 extension = <span>"php_mb_string.dll"</span> */ //<span>$str</span> = <span>"黛玉123f"</span>; //<span>echo</span> strlen(<span>$str</span>); // 输出<span>10</span> //<span>echo</span> mb_strlen(<span>$str</span>,<span>'UTF-8'</span>); //输出<span>6</span> //<span>echo</span> mb_internal_encoding();//输出 ISO-<span>8859</span>-<span>1</span> // /* * php数组函数 * 数组的键名和值 * <span>1</span>.is_array()判断是否是数组,是返回TRUE,不是返回<span>false</span>,类似 is_int(); is_float(); * <span>2</span>.array explode ( string <span>$delimiter</span> , string <span>$string</span> [, int <span>$limit</span> ] )此函数将字符串分割为数组 * <span>3</span>.string implode ( string <span>$glue</span> , array <span>$pieces</span> )将数组分割为字符串 * <span>4</span>.array_values()返回数组所有的值,请给其建立数字<strong>索引</strong> * <span>5</span>.array array_keys ( array <span>$input</span> [, mixed <span>$search_value</span> = NULL [, bool <span>$strict</span> = <span>false</span> ]] ) * <span>6</span>.array_key_exists() 检索指定的键名或<strong>索引</strong>是否在数组中,存在返回<span>true</span>,否则返回<span>false</span> * <span>7</span>.array_flip()交换数组的键名和值,若存在相同值,则以最后一个键值为准 * <span>8</span>.array_search() 在数组中搜索给定的值,若存在返回对应的键名,否则返回FALSE * <span>9</span>.检索数组中是否存在某个值,存在返回<span>true</span>,不存在返回FALSE * <span>10</span>.isset(<span>$arr</span>[<span>'apple'</span>] 检测指定的键名知否存在给定的数组中,存在返回<span>true</span>,否则返回<span>false</span> * 数组的内部指针 * current(<span>$arr</span>); 返回数组中的当前单元 pos(<span>$arr</span>); 返回数组中的当前单元 key(<span>$arr</span>); 返回数组中当前单元的键名 prev(<span>$arr</span>); 将数组中的内部指针倒回一位 next(<span>$arr</span>); 将数组中的内部指针向前移动一位 end(<span>$arr</span>); 将数组中的内部指针指向最后一个单元 reset(<span>$arr</span>; 将数组中的内部指针指向第一个单元 * each(<span>$arr</span>); 返回数组当前指针单元的键名和值,以新数组的形式,且当前数组的指针向前移动一步,若到达数组最后一个单元, 则停留为最后一个单元 * 键值对被返回为四个单元的数组,键名为>,key 和 value。单元 <span>0</span> 和 key 包含有数组单元的键名,<span>1</span> 和 value 包含有数据。 * list(<span>$key</span>,<span>$value</span>); 不是真正的函数,是一种语言结构,获得数组当前元素的键名和值,并赋值给变量,list只能用于没有键名和<strong>索引</strong>的数组 * * 数组和变量之间的转换 * extract() 从数组中将变量导入到当前的符号表 * 检查每个键名看是否可以作为一个合法的变量名,同时也检查和符号表中已有的变量名的冲突。 * compact() 将变量变为数组 * 数组的分段和填充 * array_slice 在数组中取出一段 * array_slice(<span>$array</span>,int offset,[int length,<span>false</span>|<span>true</span>]); * 若偏移量为负数,则从数组末端开始数 * 若长度为负数,则序列将终止在距离数组末端这么远的地方 * array array_splice ( array &<span>$input</span> , int <span>$offset</span> [, int <span>$length</span> = <span>0</span> [, mixed <span>$replacement</span> ]] ) * 删除数组的某段,根据offset和length,可以用replacement替换被被删除的单元,替换个数和被替换的单元的个数一致,如果为数组,则键名 * 不保留,只替换值,也可以为字符串,如果没有删除的单元,那么替换的变量将会被插入到offset的位置 * * 分割多个数组 * array_chunk(array,size,[<span>true</span>|<span>false</span>]) * 将一个数组分割成多个数组,每个数组的元素量为size,size小于<span>1</span>将报错,可能最后一个数组的元素小于size,默认为<span>false</span>,将丢掉原数组的<strong>索引</strong>或键名 * 重新建立从<span>0</span>开始的数字<strong>索引</strong>,为<span>true</span>时,保留原来的键名或<strong>索引</strong> * * 数组的填充 * array_pad(array,length,value); * 将数组用value填充到length长度, * 若length小于等于数组的长度,则不填充 * 如果length为负数, 则向左填充 * * 数组与栈 * array_push(array,value,,,); * 将一个或多个值压入数组栈,返回此数组的元素个数 * array_pop(array); * 返回一个数组的栈顶元素,如果数组为空或者不是数组,则返回NULL * * 数组与列队 * array_shift(array); * 将返回数组的第一个元素,数组的元素个数减一,后面的元素向前移动,数字键名从<span>0</span>开始重新技术,关联键名不变 * 若数组为空,或不为数组,则返回NULL * array_unshift(array,value,,,); * 将值插入数组的开头,所有的数字<strong>索引</strong>将重新从<span>0</span>开始技术,关联键名不变 * * 数组排序 * 键值排序 * sort(array,[]); 将数组的值从小到大排序,操作成功返回<span>true</span>,否则返回<span>false</span> * 忽略键名的数组排序 * rsort(array[],,),将数组的值从大到小排序,操作成功返回<span>true</span>,否则返回<span>false</span> * 忽略键名的数组排序 * usort(array,funcname);调用用户定义的函数对数组排序 * 忽略键名的数值排序 * * asort() 保留键名的数值排序 * arsort() 保留键名的数值排序 * uasort() * ========= * 键名排序 * ksort() 用键名排序,主要用于关联数组 * krsort() 按照键名逆序排序 * uksort() 自定义函数排序 * ========= * 自然排序法排序 * natsort();自然排序 * natcasesort()自然排序,忽略大小写 * * 数组的计算 * array_sum()计算数组元素的和 * 数组的合并 * array_merge(array1,array2);则键名会以连续方式重新<strong>索引</strong> * array1+array2 对于相同的键名只保留第一个 * 如果你想完全保留原有数组并只想新的数组附加到后面,用 + 运算符 * array_merge_recursive() 递归合并数组 * 如果输入的数组中有相同的字符串键名,则这些值会被合并到一个数组中去,这将递归下去,因此如果一个值本身是一个数组,本函数将按照相应的条目把它合并为另一个数组。然而,如果数组具有相同的数组键名,后一个值将不会覆盖原来的值,而是附加到后面。 * * 数组的差集 * array_diff(array1,array2,array3,,,);返回在array1中但不在其他数组中的元素 * array_diff_assoc(array1,array2,array3...);返回在array1中但不在其他数组中的元素,键名也做比较,只有键名和键值都相同时才算 * * 数组的交集 * array_intersect(array1,array2,,,);返回数组的交集 * array_intersect_assoc(array1,array2,,,);返回数组的交集,键名也做比较 * * 其他的数组函数 * range(start,max,step);创建一个start到max范围的一个数组,step为步长,默认为<span>1</span> * array_unique()除去数组中重复的值 * array_reverse();反转数组,若第二个参数为<span>true</span>时则保留键名 * array_rand(array,size);随机返回数组中的一个或多个单元的键名,若为多个则返回包含多个键名的数组 * shuffle(array); 将数组的元素打乱,返回FALSE或TRUE * * * */ //var_dump (is_array(<span>3</span>)); <span>$arr</span> = explode(<span>","</span>,<span>"I,am,hello,3"</span>); print_r(<span>$arr</span>); <span>echo</span> implode(<span>$arr</span>); //array_values() <span>$arr</span> = array_values(array(<span>'name'</span>=><span>'daiyutage'</span>,<span>"age"</span>=><span>20</span>)); print_r(<span>$arr</span>); <span>$arr</span> = array_keys(array(<span>'name'</span>=><span>"daiyutage"</span>,<span>"age"</span>=><span>20</span>)); print_r(<span>$arr</span>); var_dump(array_key_exists(<span>'name'</span>,array(<span>"name"</span>=><span>"daiyu"</span>))); var_dump (array_flip((array(<span>"a"</span>=><span>1</span>,<span>"b"</span>=><span>1</span>,<span>"ddd"</span>=><span>33</span>)))); <span>echo</span><span>in</span>_array(<span>"daiyutage"</span>,array(<span>"name"</span>=><span>"daiyutage"</span>)); <span>$arr</span> = array(<span>"name"</span>=><span>1</span>); <span>echo</span> isset(<span>$arr</span>[<span>'name'</span>]); <span>$foo</span> = array(<span>"Robert"</span> => <span>"Bob"</span>, <span>"Seppo"</span> => <span>"Sepi"</span>,<span>"name"</span>=><span>3324</span>); <span>$bar</span> = each(<span>$foo</span>); print_r(<span>$bar</span>); <span>$bar</span> = each(<span>$foo</span>); print_r(<span>$bar</span>); <span>$info</span> = array(<span>"name"</span>,<span>"haha"</span>); <span>unset</span>(<span>$a</span>); list(<span>$a</span>[<span>0</span>],<span>$a</span>[<span>1</span>]) = <span>$info</span>; //print_r(<span>$a</span>); // //<span>$name</span> = <span>"diayutage"</span>; //extract(array( // <span>"name"</span>=><span>"xue"</span>, // <span>"age"</span>=><span>22</span>, // <span>"school"</span>=><span>"lut"</span> //),EXTR_PREFIX_SAME,<span>'WX'</span>); //<span>echo</span><span>$name</span>,<span>" "</span>,<span>"<span>$age</span>"</span>,<span>" "</span>,<span>"<span>$school</span>"</span>,<span>" "</span>,<span>$Wx_name</span>; //课本,<span>1</span>,<span>2</span>,<span>3</span>,《书读百遍,其义自现》 //compact <span>$firstname</span> = <span>"Peter"</span>; <span>$lastname</span> = <span>"Griffin"</span>; <span>$age</span> = <span>38</span>; <span>$color</span>=<span>"red"</span>; <span>$rs</span> = array(<span>"color"</span>,<span>"fx"</span>); //<span>$result</span> = compact(<span>"firstname"</span>, <span>"lastname"</span>, <span>"age"</span>,<span>$rs</span>); //print_r(<span>$result</span>); <span>$arr</span> = array(<span>"a"</span>,<span>"xx"</span>=><span>"b"</span>,<span>6</span>=><span>"c"</span>,<span>"d"</span>,<span>"e"</span>); //print_r(array_slice(<span>$arr</span>,<span>2</span>,-<span>1</span>,<span>true</span>)); // array_splice(<span>$arr</span>,<span>1</span>,-<span>4</span>,<span>"xxxxx"</span>); // print_r(<span>$arr</span>); //print_r(array_chunk(<span>$arr</span>,<span>2</span>,<span>false</span>)); //print_r(array_pad(<span>$arr</span>,-<span>10</span>,<span>33</span>)); //print_r(array_push(<span>$arr</span>,<span>"daiyutage"</span>,<span>"fff"</span>)); //<span>echo</span> array_pop(<span>$arrs</span>); //<span>echo</span> array_shift(<span>$arr</span>); array_unshift(<span>$arr</span>,array(<span>"hasdf"</span>,<span>"sf"</span>)); <span>$fruits</span> = array(<span>"lemon"</span>, <span>"sdfsf"</span>=><span>"orange"</span>, <span>"banana"</span>, <span>"apple"</span>); rsort(<span>$fruits</span>); function cmp(<span>$a</span>,<span>$b</span>){ <span>return</span><span>$a</span>==<span>$b</span>?<span>0</span>:<span>$a</span><<span>$b</span>?-<span>1</span>:<span>1</span>; } //<span>$brr</span> = array(<span>"fsf"</span>,<span>"fs"</span>=><span>3</span>,<span>10</span>=><span>2</span>,<span>4</span>=><span>244</span>,<span>3244</span>); //ksort(<span>$brr</span>); //print_r(<span>$brr</span>); //print_r(array_merge(<span>$fruits</span>,<span>$brr</span>));//则键名会以连续方式重新<strong>索引</strong> //<span>$a</span> = array(<span>3</span>=><span>"red"</span>,<span>"hello"</span>,<span>"hello"</span>); //<span>$b</span> = array(<span>"red"</span>,<span>"fe"</span>); //print_r(array_intersect_assoc(<span>$a</span>,<span>$b</span>)); //var_dump(range(<span>0</span>,<span>12</span>,<span>9</span>)); //print_r(array_reverse(<span>$fruits</span>)); //print_r(array_rand(<span>$fruits</span>)); //(shuffle(<span>$fruits</span>)); // print_r(<span>$fruits</span>); // /* * 时区设置 * date_default_timezone_<span>set</span>()设置时区,时区不正确会报错抛出 E_WARNING 而不是 E_STRICT。不区分大小写 * date_defalut_timezone_get()获取时区 * 中国时区为Asia/Shanghai 或 PRC * */ //<span>echo</span> date_default_timezone_get(); //error_reporting(E_ALL); //date_default_timezone_<span>set</span>(<span>"PRC"</span>); //<span>echo</span> date_default_timezone_get(); // /* CGI,PHP_mod,FastCGI的区别 * CGI 通用网关协议 * 当客户端请求服务器时,服务器fork一个进程,执行php.cgi程序对php页面进行解析,解析完进程销毁,返回服务器, * 每次的请求过程,fork->执行->销毁,效率很低,耗费较多的系统资源 * php_mod * php解释器以模块的形式同apache服务器一起启动,使用同一个进程 * FastCGI * CGI的增强版,相当于一个中间层,使用一个进程,客户端->服务器->FastCGI->php解释实例,FastCGI用一个进程常驻内存,并创建多个CGI实例 * apache与FastCGI的通信为tcp通信,即FastCGI可以为本机,也可以为远程主机 * apache与CGI的通信为<strong>进程间通信</strong>,必须为同一主机 * 小总结: cgi : 需要开启若干个进程; fastcgi : 需要额外开启一个进程; php_mod :无需开启额外进程,因为PHP解析器已集成到web服务器中,跟web服务器在同一个进程。 * * php_mod配置方式 * 在apache中,httpd.conf中 * <span>1</span> LoadModule php5_module <span>"C:/php5/php5apache2_2.dll"</span>//大约line <span>127</span><span>2</span> PHPinidir <span>"C:/php5/php.ini"</span><span>3</span> //修改配置 <span>4</span> DirectoryIndex index.html index.php//追加index.php <span>5</span> AddType application/x-httpd-php .php //line <span>408</span>左右添加 * CGI配置方式 * * */ //error_reporting(E_ALL); //setcookie(<span>"haha"</span>); /* * cookie 与 session * cookie[<span>'login'</span>] = <span>true</span>; * A访问 * session盒子开 * session[<span>'login'</span>] = <span>true</span>; * B访问 * session盒子开 * session[<span>'login'</span>] = <span>true</span>; * session 在内存中,如果不区分每一个客户端的session,那么session将无法使用 * 所以需要将每一个请求的session与其客户端关联 * 方法: * 当第一次请求服务器时,服务器生成一个session_id, * 通过http头将session_id发送给浏览器,浏览器保存在将此session_id保存在本地的cookie中 * 当再次请求服务器时,浏览器发送此cookie,服务器收到后用本地cookie中的session_id来访问此客户端的session * * 当cookie被禁用时,如何使用session * php默认有两种session传递方式 * <span>1</span>.cookie * <span>2</span>.url 如.php?sid=xxx,或者post提交方式,手动通过url添加sid * url 通过设置php.ini参数,自动添加到url * session.use_cookie=<span>1</span> * session.use_>0 * session.use.trans_id=<span>1</span> * 然后php会自动在url加PHPSESSION=XXXX * * <span>3</span>.文件保存sid,第一个页面把sessionid保存在文件中,第二个页面先从这个文件中取sessionid在判断是否登录 * <span>4</span>.数据库保存sid,和文件原理相同 * * 当cookie被禁用时,浏览请求时不会再发送cookie到服务器,那么服务器就会收不到cookie=PHPSESSION的,不能使用session * 使用url * 在前一个页面开启session后,用session_id()获得session_id,然后以get/post方式传递到后一个页面 * 第二个页面在用此sessio_id来设置 session_id(),然后开启session_start(),就可以使用前面穿过来的session * 注意:session_id()必须在session_start()之前调用 * * * */ session_start(); <span>$_SESSION</span>[<span>'login'</span>] = <span>"daiyutage"</span>; //<span>$sid</span> = session_id(); <span>echo</span><span>"<a href='b1.php'>另一个页面</a>"</span>;</code>
以上就介紹了php學習01,包含了include,進程間通訊,物件,索引,靜態方法方面的內容,希望對PHP教學有興趣的朋友有所幫助。