PHP学习笔记

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 = "我的邮箱是[email protected]";
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' => '[email protected]',
    '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'=>'[email protected]',
         '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);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章