变量 强类型 弱类型 简单的说:强类型语言编译质量更好,执行速度更快,但代码臃肿、死板。弱类型语言开发更敏捷,自由度更高,但效率略低。 php 变量和常量区分大小写 其他不区分 内存中的地址都用十六进制表示 应用赋值 $b = &$a;//把$a的内存地址赋值给$b; 类型 float docuble float //小数点后面有1位 4个字节 docuble //小数点后面有多位 8位 占八个字节 特殊类型 resource null $fp = fopen('1.php','r');//资源类型 声明整形变量 $int = 10; $int = 045; $int = $0xff;//以0x或0X开头的表示以16进制声明一个变量 0-9 a-f A-F 整数在内存中存4个字节 2的32次方 20多亿 $float = 10; $float = -10; $float = 3.14E5; $float = 3.14E+5; $float = 3.14E-5; 单引号可以转移"\" $int = 10; $str = "aaa{$int}aaa{$int}"; 声明大量字符串 字符串中可能会有好多单引号和双引号 用定界符号声明字符串 $str = <<<hello //这里的后面不能有任何字符 空格也不可以 hello;//也要以这个字符串结束,但结束前也不能有任何字符 定界符号声明和双引号的功能是一样的 并且里面可以放双引号 强制类型转换 settype(变量,int); gettype intval() floatval() stringval() 整形有4个字节 32 最大数位2的31次方 有符号位 0表示整数 负数和javascript中的反码是一样的 ~取反然后加1 $a='123.123e5fsdfjas'; $int = intval($a); echo $int;//123 echo floatval($int);//12312300 int 会向float转 小的转大的 isset(); //值如果是null,也表示空 empty(); //判断一个变量是否为空 , "" ,null unset(); is_bool(); is_int() is_integer() is_long() is_string() is_float() is_double() is_real() is_array() is_object() is_resource() is_null is_scalar(); is_numberic();//检测变量是否为数字或数字字符串 is_callable();//检测函数是否存在 并且可以用来检测一个对象中的方法是否存在 如果给出的变量参数 var 是一个标量,is_scalar() 返回 TRUE,否则返回 FALSE。 标量变量是指那些包含了 integer、float、string 或 boolean的变量,而 array、object 和 resource 则不是标量。 is_numberic(); 写php代码时最好不要把html放入变量中 ,而是直接输出 php中没有<<< >>> 无符号移动 浮点型不能够进行左移和右移运算 decbin bindec 十进制和二进制之间的转换 str_pad 给字符串填充给定字符 $num = null; echo isset($num);//false; echo empty($num);//true break,continue 可以用在while循环和do while中 break默认推出第一层循环 break 1 break 2 break 3 死循环 $i = 0; while($i<10){ if($i == 5) continue; echo "#############<br />": $i++; } 静态变量只能声明在函数中(类中),不能在全局声明 使用static在变量前; 作用:1.一个变量可以在同一个函数在多次调用中同用 2.静态变量在静态代码段中保存 3.一个函数多次调用之间共用,但只在第一次调用 函数执行时声明到内存,以后再调用,就不再声明,而直接使用 变量函数 $var(); 系统函数在php解释器里有内部关系 效率非常高 func_get_args(); func_get_arg(参数下标); array_filter(); //array array_filter (array$input [,callback$callback ] ) array_filter() 依次将 input 数组中的每个值传递到callback 函数。如果callback 函数返回TRUE,则input
数组的当前值会被包含在返回的结果数组中。数组的键名保留不变。 function demo($num){ echo $num."<br />"; if($num>0) demo($num-1); else echo "----------------<br />"; echo $num."<br/>"; } demo(10); $dir = opendir($dirname); readdir($dir); readdir($dir); while ($filename = readdir($dir)){ $newfile = $dirname . "/" .$filename; if(is_dir($newfile)){ // }else{ // } } closedir($dir); require 静态包含 require_once //效率比require慢 include 动态包含 include_once php系统在加载php程序时有一个伪编译过程 ,可使得程序运行速度加快。但include的文档仍为解释执行。 count的别名sizeof each()函数 返回的数组时0,1,key,value四个下标(固定的) Array ( [1] => sdfd [value] => sdfd [0] => 2 [key] => 2 ) list 需要将一个数组赋值给这个函数 list($name,$age,$sex) = array("zhangsan",10,"nan"); $name //zhangsan list($name,,$sex);//支持这种格式 list只能接受索引数组 按索引的下标的顺序接受 这样写的效率据说要高一些 $user = array('id'=>1,'name'=>'zhangsan','age'=>10,'sex'=>'nan'); while(list($key,$value) = each($user)){ echo $key."==>".$value."<br />"; } $user = array('id'=>1,'name'=>'zhangsan','age'=>10,'sex'=>'nan'); while(list($key,$value) = each($user)){ echo $key."==>".$value."<br />"; } $user = array('id'=>1,'name'=>'zhangsan','age'=>10,'sex'=>'nan'); while(list($key,$value) = each($user)){ echo $key."==>".$value."<br />"; } //连续遍历只执行一次 可以用 next prev reset end 超全局数组 $_ENV 执行环境提交至脚本的变量 $_SERVER 变量由web服务器设定的,或 直接和当前脚本的执行环境相关联 $GLOBALS 只要是当前脚本有效的变量都在这里,数组键名位全局变量的名称 register_globals = on //全局变量开启 为了服务器的安全通常会关掉 url地址的默认长度为8092个字节 post的的大小可以在配置文件中指定的 $_REQUEST 包含$_GET $_POST $_COOKIE 尽量不用$_REQUEST $_FILES 文件上传 array_values返回数组中所有的值并给其建立数字索引 list接受数字索引 按索引顺序接受 array_keys(array input[,mixed search_value,[,bool strict]]) in_array()还可以用来判断数组是否存在 if (in_array(array('b','a'),$lamp)) { $lamp = array('os'=>'linux','webserver'=>'apache','db'=>'mysql','language'=>'php','sorce'=>100,array('a','b')); array_key_exists('os',$lamp);//键值是否存在 array_filp 交换数组中的键和值 array_reverse 返回一个单元顺序相反的数组 count($arr,1) //1表示 把数组中的子数组的个数找出来 递归 array_count_values 统计数组中所有的值出现的次数 array_unique 移除数组中的重复的值 使用回调函数处理数组的函数 array_filter //过滤数组中的单元 array_walk //数组中的每个成员应用用户函数 $lamp = array('os'=>'linux','webserver'=>'apache','db'=>'mysql','language'=>'php'); $c = 'dsj'; array_walk($lamp,'myfun1',$c); function myfun1(&$value,&$key,$c){ $value = 'bbbbbbbbbb'; $key = 'aaa'; } print_r($lamp); array_map() //将回调函数作用到给定的数组单元上 $lamp = array('os'=>'linux','webserver'=>'apache','db'=>'mysql','language'=>'php'); $lamp1 = array('os'=>'linux','webserver'=>'apache1','db'=>'mysql','language'=>'php'); $arr = array_map('myfun1',$lamp,$lamp1); function myfun1($n,$m){ if($n==$m){ return "same"; }else { return 'diffrent'; } } print_r($arr); sort(&$arr);//升序排序 rsort(&$arr);//降序排序 ksort krsort asort arsort 根据元素的值对数组排序 保留键值 natsort natcasesort //自然排序法 根据用户自定义规则对数组排序 多维数组进行排序 array_multisort array_splice //和substr的用法一样 array_slice array_combine //创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值 array_merge array_intersect //返回相同的值 array_diff //返回数组的差集 栈后进先出 队列是先进先出 列表都可以 $a1[] = "one"; array_push($a1,"three"); array_pop 弹出数组中最后一个元素 array_unshift 压入第一个元素 array_shift 弹出第一个元素 unset(); array_rand(); //随即返回数组中的键值 shuffle(); array_sum(); range(); php提高速度小技巧 include_once include //尽量用include 不用include_once require_once require // 能用系统函数来完成的就不要自己定义函数 面向对象 分装 继承 多态 容易维护 重用性强 最难的就是如何设计出面向对象的程序 一个文件只保存一个类 文件名种包含类名 文件:类名.class.php 为了自动加载 声明属性 当不确定使用什么修饰词时 用var或public 一般类中的属性先声明 先不初始化 class Person{ var $name; var $age; var $sex; function say(){ } function eat(){ } function run(){ } } //$p1 = new Person; 创建对象new 类名; 只要有new关键字就是创建对象 只要创建对象就分配了内存空间 对象中的成员必须通过对象的引用来访问 被包含的文件都不需要加?> __construct() //优点:在改变类名时,构造方法不用改变 function __construct($name,$age){ $this->name = $name; } function person($name,$age){ $this->name = $name; } //在php5中先找 __construct 如果找不到__construct 再找person //在php4中 只找person __construct(); __destruct(); __set(); __get(); __isset(); __unset(); __clone(); __call(); __sleep(); __weakup(); __toSring(); __autoload(); 垃圾回收器(java php) 而c++手动释放 php中的垃圾回收器是当堆内的空间一旦成为垃圾 则回收掉 java中的成为垃圾之后还要等会 $p1 = new Person(); 当页面脚本执行完 也就是没有代码可执行了 脚本运行完 $p1引用的堆的内存成为垃圾 立马释放 $p1 = null;//$p1引用的堆的内存成为垃圾 立马释放 当页面脚本执行完 脚本中的代码将会被释放 除了session 至于何时该去调用mysql_close(),最正确的做法是如果下面不再执行mysql的操作了,在你上一次执行完mysql操作后,立刻就调用mysql_close()。这才是最正确的做法,并不是总要把mysql_close()写在页面最后一行就可以了。 析构方法__destruct(); 当对象被释放之前最后一个“自动”调用的方法 关闭一些资源,做一些清理的工作 $p1 = new Person(); $p2 = new Person(); $p3 = new Person(); $p1 $p2 $p3 是放在栈中 先进后出 当执行析构函数的时候是 先p3 p2 p1 看类写的代码 只看public方法就可以了 或者是没有修饰符的方法 封装 封装属性 一般类中的属性是不可以被改变的 就算改变 也是在一段小范围内的改变 所以声明属性时一般设置为private protected 也就不能再外部更改或读取它的值 控制属性的范围可以写一个外部调用的方法 用这个方法来控制属性的范围或者读取 __get();是直接获取成员属性值时,自动调用的方法 并返回 __set();是直接设置成员属性值时,自动调用的方法 并返回 这两个只有弱类型语言里才有 java里就没有 __isset();是直接查看对象中的私有属性是否存时自动调用这个方法 在外部执行isset($p1->name);时调用的方法 __unset();是直接删除对象中私有属性时,自动调用的方法 封装性 就是把对象的成员(属性,方法)结合成一个独立的相同单位,并尽可能隐藏对象的内部细节 父类 = 基类 子类 = 派生类 c++属于多继承 php java 单继承 成员属性和方法默认是public 在java中会有函数重载 因为java是强类型语言 function add(int a,int b){ return a+b; } function add(float a,float b){ return a+b; } 对象->成员 类::成员 父类名::方法名 parent::方法名 注意:在子类中编写构造方法,如果父类中也有构造方法 一定要去调用一次父类中被覆盖的那个构造方法 子类中重载的方法,不能低于父类中的访问权限(子类可以放大权限,但不能缩小权限) final 1.final不能修饰成员属性(类中常量不是用这个关键字) 2.final只能修饰类和方法 作用 1.使用final修饰的类 不能被子类继承 2.使用fianl修饰的方法不能被子类去覆盖 static 1.使用static可以修饰成员属性和成员方法,不能修饰类 2.用static修饰的成员属性,可以被同一个类的所有对象共享 3.静态的数据时存在内存的数据段中(初始化静态段) 4.静态的数据时在类每一次加载时 分配到内存中的,以后再用到类时就直接从数据段中获取 5.什么是类被加载?只要在程序中使用到这个类(有这个类名出现) $p1 = new Person(); //这就是被加载 注意:静态的成员都要使用类名去访问,不能创建对象 静态的东西是属于类级别的 并不属于对象级别的 如果在类中使用静态成员 用self:: 方便 static 方法 超全局的方法 静态方法不能访问非静态的成员 如果确定一个方法不使用非静态的成员,则可以将这个方法声明为静态方法(不能创建对象,直接使用类名就可以访问) 静态成员:类名::成员 ,在类内部访问其他成员 self::成员 单态设计模式 一个类不能产生对象 构造方法用私有的封装 类内部创建一个对象 const 1.他只能修饰成员属性 2.类中声明常量属性使用const 3.命名的方式和我们以前学习define是一样的效果 4.访问方式和static静态成员属性是一样(在类外部使用 类名::常量 在类内部使用 self::常量) 5.常量一定要在声明时给初值 什么时候自动调用 __call(); 在调用对象中不存在的方法时就会出现系统报错 , 然后程序退出 就会在调用一个对象中不存在的方法时自动调用 处理一些不存在方法的错误调用 __toString(); 直接输出对象引用,用来快速获取对象的字符串表示的最便捷的方式 __clone() $p4 = $p1 ;//在栈内存中分配一块空间给$p4 和p1中的地址相等 原本(原来的对象) 副本(复制出来的对象) /* * * opcode number: 110 */ $obj = new A(); $copy = clone $obj; ?> __clone() 就是在克隆对象是自动调用的方法 只要一个对象一诞生,就要有初始化的动作,和构造方法__construct作用相似 在__clone()方法中的 $this关键字,代表的是复本 __autoload() 其他的魔术方法都是在类内部 这个是在类外部 只要在页面中使用到一个类 ,只要用到类名就会自动将类名传给这个参数 抽象类时一种特殊的类 ,接口是一种特殊的抽象类,而多态就要使用到抽象类或接口(就是一个方法没有使用{}而直接使用分号结束) 什么事抽象方法 function test();//抽象方法 function test(){//有方法体,但方法体为空 } 什么事抽象类? 如果一个类中,有一个方法时抽象的则这个类就是抽象类 如果一个类时抽象类,则这个类必须要使用abstract修饰 抽象类时一种特殊的类,就是因为一个类中有抽象方法,其他不变。也可以在抽象类中声明成员属性,常量,非抽象的方法 抽象类不能实例化对象(不能通过抽象类去创建一个抽象类的对象) 对象中的方法和属性都要通过对象来访问,除常量和静态的变量和方法,而抽象类又不能创建对象,抽象类中的成员都不能直接访问 作用 要想使用抽象类,就必须使用一个类去继承抽象类,而且要想使用这个子类,也就是让子类可以创建对象,子类就必须不能再是抽象类,子类可以重写父类的方法(给抽象方法加上方法体) 抽象方法中的方法没有方法体,子类必须实现这个方法(父类中没写具体的实现,但子类必须有这个方法名) 就是在定义一些规范,让子类按这些规范去实现自己的功能 目的:就是要将你写的程序模块 加入到原来已经写好的程序中去 (别人写好的程序,不能等你开发完一个小模块,根据你的小模块向后开发) 接口技术 接口中是一种特殊的抽象类,抽象类又是一种特殊的类 接口和抽象类时一样的作用 因为在php是单继承,如果使用抽象类,子类实现完抽象类就不能去继承其它的类了 如果即想实现一些规范,又想继承一个其它类。就要使用接口 接口和抽象类对比 作用相同,都不能创建对象,都需要子类去实现 接口的声明和抽象类不一样 接口被实现的方式不一样 接口中的所有方法必须是抽象方法,只能声明抽象方法(不用使用abstract修饰) 接口中的成员属性,只能声明常量,不能声明变量 接口中的成员访问权限 都必须是public ,抽象类中最低的权限protected 如果子类是从写父类接口中抽象方法,则使用implements,类-接口 接口-接口 extendss 可以定义一个接口去继承另一个接口 一个类可以去实现多个接口 (按多个规范去开发子类),使用逗号分隔多个接口名称 一个类可以在继承一个类的同时,去实现一个或多个接口 使用implements的两个目的 1.可以实现多个接口,而extends只能继承一个父类(先继承在实现) php中的多态其实就是方法重写 一个子类可以重新修改父类的某个方法 使其具有自己的特性 重写要求子类方法和父类方法有相同的名称 notice不会影响程序 无关紧要 其他类型的数据用在字符串处理函数中,会自动将其转为字符串后,在处理 可以将字符串视为数组,当做字符串集合来看待 $str = "abcdefg";//好像不能是中文 echo $str[2]; echo $str{2}; echo('hhhhhhh','jjjjjjj','mmmmmmm');//不允许这么用 print 服务器正在往客户端输出 这时浏览器突然关闭 那么服务器可以根据返回值判断是否成功输出了 效率比较低 exit die 一样的 输出数字有问题 格式化字符串用 printf sprintf %% %b %c ascII表中的数值 %d %f %o %x %s str_pad strtolower strtoupper ucfirst ucwords 将字符串中每个单词的首字母转换为大写 nl2br htmlentitieshtmlspecialchars html_entity_decode htmlspecialchars_decode 两个函数在格式化带有英文字符的html代码的时候基本没啥问题,但是htmlentities对中文字符也不放过,这样得出来的结果是中文字符部分变为一堆乱码。 stripslashes addslashes number_format strtev //字符串进行翻转处理 md5 md5_file();计算指定文件的 MD5 散列值 strcmp strcasecmp 以上是按字节顺序 一下是按自然数排序 strnatcmp 在PHP中所有字符串处理函数,都不是在原字符串上修改, 而是返回一个新格式化后的字符串 trim();//去掉两边特殊字符 str_pad();//在字符串两边添加特殊字符 POSIX 扩展正则表达式 ereg Perl 兼容正则表达式 效率高 用这个 preg Perl 兼容java javascript perl等 1.定界符号 // 反斜线 除了字母、数字和正斜线\以外的任何字符都可以为定界符号 || // {} ## !! 没有特殊需要,我们都使用正斜线作为正则表达式的定界符号 '#\<img\s*src=\".*?\"\/>"/iU#' 2.原子 img \s . 注意:原子是正则表达式的最基本组成单位,而且必须至少要包含一个原子 只要一个正则表达式可以单独使用的字符,就是原子 1.所有打印(所有可以在屏幕上输出的字符串)和非打印字符(看不到的 空格 回车) 2. . * + ? < > 统统使用“\”转义 不管有没有意义 如果怀疑他有问题 都可以转义 比如怀疑字母m有问题 \m '\' 转义字符可以将有意义的字符转成无意义的字符 3.在正则表达式中可以直接使用一些代表范围的原子 \w表示任意一个字 0-9 a-zA-Z 4.自己定义一个原子表,可以匹配方括号中的任意一个原子 {}用于自己定义前面原子出现的次数 {m} //m表示一个整数,{5}表示前面的院子出现5次 {m,n} //m要小于n,表示前面出现的原子,最少m次,最多n次,包括m和n次 {m,}//表示前面的原子最少出现m次,最多无限 . 表示除换行符外的任意一个字符 \n 3.元字符 * ? {} () 反向引用,可以在模式中直接将子模式取出来,再作为正则表达式模式的一部分,如果是在正则表达式像替换函数preg_replace函数中,可以将子模式取出,在被替换的字符串中使用 \1 取第一个子模式,\2取第二个子模式 .... \s(注意是单引号还是双引号引起来的正则) "\\1" '\1' ${1} ${2} 这个在本身的模式中是取不出的 优先级 \ () (?:) [] * + ? {} ^$\b | 4.模式修正符号 i U i: m:默认情况,字符串视为一行 ^ $ m视为多行后,任何一行都可以以正则的开始或结束 s:如果没有使用模式修正符时,元字符中的.默认不能表示换行符号 x:模式中的空白忽略不计 e:只能在preg_replace中用 U:正则表达式的特点:就是比较“贪婪” .* .+ 所有字符都符合这个条件 一种使用模式修正符号 U 一种使用? .*? .+? 如果两种方式同时出现又开启了 贪婪模式 .*? /U preg_match_all(,,PREG_SET_ORDER);PREG_SET_ORDER显示的格式不一样 字符串函数 //strstr stristr strstr('字符串','');//如果第二个参数是数字的话 则把数字作为ascii码 匹配对应的字母 //strpos stripos basename(); str_replace() str_ireplace() //字符串中的替换函数 1.str_replace(string,string,string,$count); 2.str_replace(array,string,string,$count); 3.str_replace(array,array,string,$count); html标签一般不要插入到数据库中 preg_replace 正则中的替换函数 1.正常使用preg_replace('string','string','string'); 2.在正则中的子模式,可以用到第二个参数 3.在第二个参数中调用函数,需要在模式中使用 e 模式修正符号 4.就是在前两个参数中都使用数组,可以一起将多个模式(正则)同时替换成多个值的形式 preg_split array preg_grep (string
$pattern , array
$input [, int
$flags = 0 ] )
返回给定数组input中与模式pattern 匹配的元素组成的数组 print_r(preg_grep('/\d/',$arr));
echo preg_quote($str); 调试程序分为 注释调试法 输出调试法 将错误报告写入日志中 1.指定错误报告 error_reporting = E_ALL 2.关闭错误输出 display_errors = Off 3.开启错误日志功能 log_errors = On 1.默认如果不指定错误日志位置,则默认写web服务器的日志中去 2.为error_log选项指定一个文件名(可写) 3.写入操作系统日志中 error_log=syslog error_log //当错误报告要输出到配置文件中去时 如果try中代码有异常发生,则抛出一个异常对象,抛出(throw)给了catch参数,则在try中代码就不会再继续执行下去 直接跳转到catch中去执行,catch中执行完成,再继续向下执行 注意:提示发生了什么异常,这不是主要我们要做事,需要在catch中解决这个异常,如果解决不了,则输出给用户 try { @$file = fopen('hello.txt','r'); if(!@$file){ throw new Exception('文件打不开'); } }catch (Exception $e){ //print_r($e); //echo $e->getMessage(); echo $e; } 自定义一个异常类 1.自己定义异常类,必须是Exception(内置类)子类 2.Exception类中的只有构造方法和__toString方法被覆盖
私有的方法可以被子类覆盖掉 如: class User{ |
|
来自: 小小243 > 《php mysql》