php语法
- php数组之foreach循环访问索引数组里的值
foreach($var as$k=>$v){echo '<br>第 '.$.'值是:'.$v;}
- php之map初始化
$fruit=array(
'apple'=>"苹果",
'banana'=>"香蕉",
'pineapple'=>"菠萝"
);
- php之对象
class Car {
private function __construct() {
echo 'object create';
}
private static $_object = null;
public static function getInstance() {
if (empty(self::$_object)) {
self::$_object = new Car(); //内部方法可以调用私有方法,因此这里可以创建对象
}
return self::$_object;
}
}
//$car = new Car(); //这里不允许直接实例化对象
$car = Car::getInstance(); //通过静态方法来获得一个实例
- php类和对象之重载
PHP中的重载指的是动态的创建属性与方法,是通过魔术方法来实现的。属性的重载通过__set,__get,__isset,__unset来分别实现对不存在属性的赋值、读取、判断属性是否设置、销毁属性。
class Car {
private $ary = array();
public function __set($key, $val) {
$this->ary[$key] = $val;
}
public function __get($key) {
if (isset($this->ary[$key])) {
return $this->ary[$key];
}
return null;
}
public function __isset($key) {
if (isset($this->ary[$key])) {
return true;
}
return false;
}
public function __unset($key) {
unset($this->ary[$key]);
}
}
$car = new Car();
$car->name = '汽车'; //name属性动态创建并赋值
echo $car->name;
- php正则表达式
正则表达式中具有特殊含义的字符称之为元字符,常用的元字符有:
\ 一般用于转义字符
^ 断言目标的开始位置(或在多行模式下是行首)
$ 断言目标的结束位置(或在多行模式下是行尾)
. 匹配除换行符外的任何字符(默认)
[ 开始字符类定义
] 结束字符类定义
| 开始一个可选分支
( 子组的开始标记
) 子组的结束标记
? 作为量词,表示 0 次或 1 次匹配。位于量词后面用于改变量词的贪婪特性。 (查阅量词)
* 量词,0 次或多次匹配
+ 量词,1 次或多次匹配
{ 自定义量词开始标记
} 自定义量词结束标记
//下面的\w匹配字母或数字或下划线。
$p = '/[\w\.\-]+@[a-z0-9\-]+\.(com|cn)/';
$str = "我的邮箱是Spark.eric@imooc.com";
preg_match($p, $str, $match);
echo $match[0];
//下面的\d表示匹配数字
$p = '/\d+\-\d+/';
$str = "我的电话是010-12345678";
preg_match($p, $str, $match);
echo $match[0]; //结果为:010-12345678
$p = '/\d?\-\d?/';
$str = "我的电话是010-12345678";
preg_match($p, $str, $match);
echo $match[0]; //结果为:0-1
$p = '/\d{3}\-\d{8}/';
$str = "我的电话是010-12345678";
preg_match($p, $str, $match);
echo $match[0]; //结果为:010-12345678
/*preg_match用来执行一个匹配,可以简单的用来判断模式是否匹配成功,或者取得一个匹配结果,他的返回值是匹配成功的次数0或者1,在匹配到1次以后就会停止搜索。*/
$subject = "abcdef";
$pattern = '/def/';
preg_match($pattern, $subject, $matches);
print_r($matches); //结果为:Array ( [0] => def )
/*上面的代码简单的执行了一个匹配,简单的判断def是否能匹配成功,但是正则表达式的强大的地方是进行模式匹配,因此更多的时候,会使用模式:*/
$subject = "abcdef";
$pattern = '/a(.*?)d/';
preg_match($pattern, $subject, $matches);
print_r($matches); //结果为:Array ( [0] => abcd [1] => bc )
\*常用正则表达式*\
<?php
$user = array(
'name' => 'spark1985',
'email' => 'spark@imooc.com',
'mobile' => '13312345678'
);
//进行一般性验证
if (empty($user)) {
die('用户信息不能为空');
}
if (strlen($user['name']) < 6) {
die('用户名长度最少为6位');
}
//用户名必须为字母、数字与下划线
if (!preg_match('/^\w+$/i', $user['name'])) {
die('用户名不合法');
}
//验证邮箱格式是否正确
if (!preg_match('/^[\w\.]+@\w+\.\w+$/i', $user['email'])) {
die('邮箱不合法');
}
//手机号必须为11位数字,且为1开头
if (!preg_match('/^1\d{10}$/i', $user['mobile'])) {
die('手机号不合法');
}
echo '用户信息验证成功';
- 会话控制(session和cookie)
PHP通过setcookie函数进行Cookie的设置,任何从浏览器发回的Cookie,PHP都会自动的将他存储在$_COOKIE的全局变量之中,因此我们可以通过$_COOKIE['key']的形式来读取某个Cookie值。
PHP中的Cookie具有非常广泛的使用,经常用来存储用户的登录信息,购物车等,且在使用会话Session时通常使用Cookie来存储会话id来识别用户,Cookie具备有效期,当有效期结束之后,Cookie会自动的从客户端删除。同时为了进行安全控制,Cookie还可以设置域跟路径。
cookie相对不是太安全,容易被盗用导致cookie欺骗单个cookie的值最大只能存储4k每次请求都要进行网络传输.占用带宽
session是将用户的会话数据存储在服务端,没有大小限制,通过一个session_id进行用户识别,PHP默认情况下session id是通过cookie来保存的,因此从某种程度上来说,seesion依赖于cookie。但这不是绝对的,session id也可以通过参数来实现,只要能将session id传递到服务端进行识别的机制都可以使用session。
默认情况下,session是以文件形式存储在服务器上的,因此当一个页面开启了session之后,会独占这个session文件,这样会导致当前用户的其他并发访问无法执行而等待。可以采用缓存或者数据库的形式存储来解决这个问题。
/* PHP设置Cookie最常用的方法就是使用setcookie函数,setcookie具有7个可选参数,我们常用到的为前5个:name( Cookie名)可以通过$_COOKIE['name'] 进行访问;value(Cookie的值);expire(过期时间)Unix时间戳格式,默认为0,表示浏览器关闭即失效;path(有效路径)如果路径设置为'/',则整个网站都有效
domain(有效域)默认整个域名都有效,如果设置了'www.imooc.com',则只在www子域中有效*/
$value = 'test';
setcookie("TestCookie", $value);
setcookie("TestCookie", $value, time()+3600); //有效期一小时
setcookie("TestCookie", $value, time()+3600, "/path/", "imooc.com"); //设置路径与域
/*了解原理以后,我们也可以直接通过header来删除cookie。*/
header("Set-Cookie:test=1393832059; expires=".gmdate('D, d M Y H:i:s \G\M\T', time()-1));
/*在PHP中使用session非常简单,先执行session_start方法开启session,然后通过全局变量$_SESSION进行session的读写。
session_start();
$_SESSION['test']=time();
var_dump($_SESSION);
/*session会自动的对要求设置的值进行encode与decode,因此session可以支持任意数据类型,包括数据与对象等*/
session_start();
$_SESSION['ary']=array('name'=>'jobs');
$_SESSION['obj']=new stdClass();
var_dump($_SESSION);
/*如果要删除所有的session,可以使用session_destroy函数销毁当前的session,session_destroy()函数销毁当前的session,session_destroy会删除所有数据,但是session_id仍然存在。*/
session_start();
$_SESSION['name'] = 'jobs';
$_SESSION['time'] = time();
session_destroy();
/*值得注意的是,session_destroy并不会立即的销毁全局变量$_SESSION中的值,只有当下次再访问的时候,$_SESSION才为空,因此吐过需要立即销毁$_SESSION,可以使用unset函数。*/
session_start();
$_SESSION['name'] = 'jobs';
$_SESSION['time'] = time();
unset($_SESSION);
session_destroy();
var_dump($_SESSION); //此时已为空
/*使用session来存储用户的登录信息*/
session_start();
//假设用户登录成功获得了以下用户数据
$userinfo=array(
'uid'=>10000,
'name'=>'spark',
'email'=>'spark@imooc.com',
'sex'=>'man',
'age'=>'18');
header("content-type:text/html;charset=utf-8");
//将用户信息保存到session中
$_SESSION['uid']=$userinfo['uid'];
$_SESSION['name']=$userinfo['name'];
$_SESSION['userinfo']=$userinfo;
//将用户数据保存到cookie中的一个简单方法
$secureKey='imooc'
$str=serialize($userinfo);
$str=base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256,md5($secureKey),$str,MCRYPT_MODE_ECB));
setcookie('userinfo',$str);
//当需要使用时进行解密
$str = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($secureKey), base64_decode($str), MCRYPT_MODE_ECB);
$uinfo = unserialize($str);
echo "解密后的用户信息:<br>";
print_r($uinfo);
- php文件系统
/*PHP具有丰富的文件操作函数,最简单的读取文件的函数为file_get_contents,可以将整个文件全部读取到一个字符串中*/
$content=file_get_contents('./test.txt');
$content=file_get_contents('./text.txt',null,null,100,500);
/*php也提供类似于C语言操作文件的方法,使用fopen, fgets, fread等方法,fgets可以从文件指针中读取一行,freads可以读取指定长度的字符串。*/
$fp=fopen('./text.txt','rb');
while(!feof($fp)){
echo fgets($fp);
}
fclose($fp);
/* 如果只是判断文件存在,使用file_exists就行,file_exists不仅可以判断文件是否存在,同时也可以判断目录是否存在,从函数名可以看出,is_file是确切的判断给定的路径是否是一个文件。*/
$filename = './test.txt';
if (file_exists($filename)) {
echo file_get_contents($filename)}
$filename = './test.txt';
if (is_file($filename)) {
echo file_get_contents($filename);}
/*更加精确的可以使用is_readable与is_writeable在文件是否存在的基础上,判断文件是否可读与可写*/
$filename = './test.txt';
if (is_writeable($filename)) {
file_put_contents($filename, 'test');}
if (is_readable($filename)) {
echo file_get_contents($filename);
}
/*文件you很多元属性,包括文件的所有者、创建实践、修改实践、最后的访问时间等*/
$filename='data/webroot/usercode/code/resource/text.txt';
echo '所有者:'.fileowner($filename).'<br>';
echo '创建时间:'.filectime($filename).'<br>';
echo '修改时间:'.filemtime($filename).'<br>';
echo '最后访问时间:'.fileatime($filename).'<br>';
//通过filesize函数可以取得文件的大小,文件大小是以字节数表示的
$size = filesize($filename);
/*与读取文件对应,PHP写文件也具有两种方式,最简单的方式是采用file_put_contents.*/
$fp = fopen('./test.txt', 'w');
fwrite($fp, 'hello');
fwrite($fp, 'world');
$filename = './test.txt';
$data = 'test';
file_put_contents($filename, $data);
/*跟unix系统命令类似,PHP使用unlink函数进行文件删除,删除文件夹使用rmdir函数,文件夹必须为空,如果不为空或者没有权限则会提示失败。如果文件夹中存在文件,可以先循环删除目录中的所有文件,然后再删除目录,循环删除可以使用glob函数遍历所有文件。*/
rmdir($dir);
foreach (glob("*") as $filename) {
unlink($filename);
}
- PHP异常处理
从PHP5开始,PHP支持异常处理,异常处理是面向对象一个重要特性。PHP代码中的异常通过throw抛出,异常抛出之后,后面的代码将不会再被执行。既然抛出异常会中断程序,那么为什么还需要使用异常处理?异常抛出被用于再遇到未知错误,或者不符合预先设定的条件时,通知客户程序,以便进行其他相关处理,不至于使程序直接报错中断。
PHP具有很多异常处理类,其中Exception是所有异常处理的基类,Expection具有几个基本属性和方法,其中包括了:message 异常消息内容 code 异常代码 file 抛出异常的文件名 line 抛出异常再该文件的行数,其中常用的方法: getTrace 获取异常追踪异常信息 getTraceAsString获取异常追踪信息的字符串 getMessage 获取出错信息。
try{
throw new Exception('wrong');
}catch(Exception $ex){
echo 'Error:'.$ex->getMessage().'<br>';
echo $ex->getTraceAsString().'<br>';
}
try {
throw new Exception('wrong');
} catch(Exception $ex) {
$msg = 'Error:'.$ex->getMessage()."\n";
$msg.= $ex->getTraceAsString()."\n";
$msg.= '异常行号:'.$ex->getLine()."\n";
$msg.= '所在文件:'.$ex->getFile()."\n";
//将异常信息记录到日志中
PHP异常处理之 file_put_contents('error.log', $msg);
}
- PHP数据库处理
/*mysql扩展进行数据库连接的方法*/
$link=mysql_connect('mysql_host','mysql_user','mysql_password');
/*选择数据库*/.
mysql_select_db('code1')
/*通常我们会先设置以下当前链接使用的字符编码*/
mysql_query("set names 'utf8'")
/*在数据库建立链接以后就可以进行查询,采用mysql_query加sql语句的形式向数据库发送查询指令*/
$res=mysql_query('select * from user limit 1')
/*对于查询类的语句会返回一个资源句柄,可以通过该资源获取查询结果集中的数据*/
$row=mysql_fetch_array($res);
var_dump($row)
/*默认的,PHP使用最近的数据库连接执行查询,但如果存在多个连接的情况,则可以通过参数指令从那个连接中进行查询*/
$link1 = mysql_connect('127.0.0.1', 'code1', '');
$link2 = mysql_connect('127.0.0.1', 'code1', '', true); //开启一个新的连接
$res = mysql_query('select * from user limit 1', $link1); //从第一个连接中查询数据
/*在实际应用中,我们并不希望一次性获取数据表中的所有数据,那样性能会非常的低,因此会使用翻页功能,每页仅显示10条或者20条数据。通过mysql的limit可以很容易的实现分页,limit m,n表示从m行后取n行数据,在PHP中我们需要构造m与n来实现获取某一页的所有数据。*/
$page = 2;
$n = 2;
$m = ($page - 1) * $n;
$sql = "select * from user limit $m, $n";
$result = mysql_query($sql);
//循环获取当前页的数据
$data = array();
while ($row = mysql_fetch_assoc($result)) {
$data[] = $row;
}
/*对于删除与更新操作,可以通过mysql_affected_rows函数来获取更新过的数据行数,如果数据没有变化,则结果为0。*/
$sql = "update user set name = '曹操' where id=2 limit 1";
if (mysql_query($sql)) {
echo mysql_affected_rows();
}
/*虽然PHP会自动关闭数据库连接,一般情况下已经满足需求,但是在对性能要求比较高的情况下,可以在进行完数据库操作之后尽快关闭数据库连接,以节省资源,提高性能。*/
$link = mysql_connect($host, $user, $pass);
mysql_close($link);