分享

php学习笔记

 小小243 2014-07-08
  变量 强类型 弱类型
简单的说:强类型语言编译质量更好,执行速度更快,但代码臃肿、死板。弱类型语言开发更敏捷,自由度更高,但效率略低。
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

htmlentities

htmlspecialchars

html_entity_decode

htmlspecialchars_decode

两个函数在格式化带有英文字符的html代码的时候基本没啥问题,但是htmlentities对中文字符也不放过,这样得出来的结果是中文字符部分变为一堆乱码。

stripslashes

addslashes

strip_tags //该函数尝试返回给定的字符串 str 去除空字符、HTML 和 PHP 标记后的结果
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 匹配的元素组成的数组

  $arr = array('zhang san','li si','wang5','zhao6','hello','nihao');
  print_r(preg_grep('/\d/',$arr));


  $str = 'ab+cd*ef{g';
  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{
    public $a;
    public $b;
    function __toString(){
        return 'bbb';
    }
     private  function __clone(){
       echo 'clone user';    
    }
}
class User1 extends User {
    
    public function __clone(){
        echo 'clone user1';
    }
    
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多