PHP笔记
PHP笔记
1.php4种标签风格及3种注释风格
i.标签风格
a.XML风格
echo "hello world!";
?>
b.ASP风格
<%
echo "hello world!";
%>
c.脚本风格
echo "hello world!";
d.极简风格
注意:当使用极简风格和ASP风格时需要在php.ini文件中配置short_open_tag和asp_tags设置为on
ii.注释风格
a.c++风格的单行注释 //
b.c++风格的多行注释 /**/
c.shell风格的注释 #
2.php脚本执行的3种参数传递与解析
a.$argc和$argv 传递参数
echo "接收到{$argc}个参数";
print_r($argv);
?>
执行结果: php.exe .\hello.php hello world -a 123
paras count : 5Array
(
[0] => .\hello.php
[1] => hello
[2] => world
[3] => -a
[4] => 123
)
b.getopt()函数解析参数
$param_arr = getopt('a:b:c:');
print_r($param_arr);
?>
执行结果:php test.php -a 345 -b 12q3
Array
(
[a] => 345
[b] => 12q3
)
c.提示用户输入
fwrite(STDOUT,'请输入您的博客名:');
echo '您输入的信息是:'.fgets(STDIN);
?>
3.php数据类型
php的变量使用$开头,属于动态数据类型,数据类型包括:
boolean string integer float array object resource null值
数据类型的定义:
a.string 单引号和双引号字符串的区别
同shell中的单双引号的区别相同,双引号的字符串需要先执行递归的变量替代
$a='hello world';
echo "hi,$a";
b1.string的界定符输出
目的:增强可读性
$string=<<
hi,
hello world
std; //结束
b2.格式化字符串
$formatted = sprintf ("hello,%s", "world");
printf($formatted);
c.array3种定义
$array=array("v1","v2");//数值自动键,从0开始
$array[key]="vkey";//字符指定键
$array=array(key1=>v1,key2=>v2) //字符键和数字键可以混用
d.null值
通常会用于变量申明
$str=null;
is_null($str) //true
$str="str"
is_null($str) //false
unset($str)
is_null($str) //true
e.数据类型之间的强制转换
$str="123"
$num=(integer)$str
$bl=(boolean)$str
f.数据类型检测函数
is_bool(),is_string,is_float(),is_double(),is_integer(),is_int(),is_null(),is_array(),is_object(),is_numeric()
g.常量定义函数
define(string 常量名,值,true/false大小写敏感)
bool defined(string 常量名) //判断该常量是否已经定义
define("ms",123)
echo ms+24;
h.php预定义常量
__FILE__ PHP程序文件名
__LINE__ PHP当前文件行数
PHP_VERSION
PHP_OS 执行PHP的OS
...
i.string的+运算和。运算
string + :表示将字符串转换成数字再执行+ (只转换字符串首部的数字,首部为字母则结果为0)
string . :表示将字符串拼接
$n="3.14r";
$m=1;
echo $n.$m , $n+$m //3.14r1 4.14
4.变量
a.变量的引用定义&
$i="hello"
$j=&$i
$i="$i,world"
echo $i // hello,world
echo $j // hello,world
b.变量的3种作用域
i.局部变量
函数中定义的变量,作用域为整个函数
ii.全局变量
函数以外的变量,作用域为当前PHP文件,但函数内部不可用,除非在函数中申明global才可作用于函数中
iii.静态变量
定义于函数中,函数结束时不会被释放
$msg="hello"; //全局变量
function hello(){
static $msg1="hello";//静态变量
global $msg; //函数中使用全局变量
$msg1="hello" //局部变量
}
?>
c.变量的递归性(可变变量)
$a="hello,world";
$b="a"
echo $$b //将输出hello,world
d.php预定义变量
$_SERVER['SERVER_ADDR'] //当前运行脚本所在的服务器IP
$_SERVER['SERVER_NAME'] //...服务器名
$_SERVER['REQUEST_METHOD'] //请求方法
$_SERVER['REMOTE_ADDR'] //
$_SERVER['REMOTE_HOST'] //
$_SERVER['REMOTE_PORT'] //
$_SERVER['SCRIPT_FILENAME'] //当前脚本的绝对路径
$_SERVER['SERVER_PORT'] //
$_SERVER['DOCUMENT_ROOT'] //当前脚本的文档根目录
$_COOKIE //通过HTTPCookie传递到脚本的信息(数组)
$_SESSION //包含与所有回话有关的信息(数组)
$_POST //包含通过POST方法传递的相关信息(数组)
$_GET //包含通过GET方法传递的相关信息(数组)
$_GLOBALS //所以已定义的全局变量组成的数组,变量名是该数组的索引(数组)
5.运算符
c语言中的所有运算符适用于PHP,并有其他运算符:
@:错误屏蔽运算符,可以屏蔽表达式产生的错误
$err=@(5/0) ;//防止系统报错,使得程序可以继续运行
6.函数
a.函数定义与调用
function fun_name($arg1,&$arg2,$arg3=value,...){
}
function exap($num){
return $num+10;
}
echo exap(10);
特点:入参的传递有2种值传递和引用传递,参数可以有默认值
b.函数作为变量值时的调用(变量函数)
$fun="exap";
$fun(10);
c.函数返回值得引用<=>函数的引用
$a=&exap(10)
echo $a."
";
unset($a) //解引用或解变量
7.流控制语句
a.if,switch,while,do...while,for与C语言相同
b.foreach 用于数组和对象
foreach(array_expression as $value) 或者 foreach(array_expression as $key => $value)
8.字符串处理
a.trim(string str[,string charlist]),ltrim,rtrim
默认删除字符串左右两边所有的空格,\0,\t,\n,\x0B,\r
b.字符串转义
"\",addcslashes(),stripcslashes()
例子:$m1="select * from t where book='m'";
$m="select * from t where book=\'m\'";
$m=addcslashes($m1)
也可以去转义
stripcslashes($m)
c.子字符串
string substr(string str,int start[,int len])
d.比较字符串
int strcmp(string str1,string str2)
int strnatcmp(string str1,string str2) 不区分大小写
int strncmp(string str1,string str2,int len)
e.字符串查找
string strstr(string str,string findstr) 返回findstr第一次出现的位置到str末尾的子字符串
int substr_count(string str,string findstr) 查找子字符串出现的次数
f.字符串替代
string str_ireplace(string new_substr,string old_substr,string str[,int count替代次数])
string substr_replace(string str,string repl,int star[,int len])
g.分割字符串
array explode(string sep,string str[,int limit限制返回值最多包含的元素])
h.合成字符串
string implode(string glue,array)
9.正则表达式
a.bool ereg/e regi(string pattern,string str[,returnarray]) 在字符串str中匹配pattern模式, 将匹配的字符放在返回数组中;如果匹配成功返回true,否则返回false。
b.string ereg_replace/eregi_replace(string pattern,string rep,string str) 使用rep替代 str中所有匹配pattern的子串,返回最后替代的结果
c.array split/spliti(string pattern,string str[,int limit]) 使用pattern分割str,返回 分割后的数组,最后返回limit个元素
d. array preg_grep(string pattern ,array input) 使用pattern匹配数组array中的所有元素, 返回完全匹配的元素(而不是部分匹配);pattern必须使用"/.../"包围
e.preg_match/preg_match_all(string pattern,string str [,array matches]) 使用pattern 匹配str中所有的子串并返回,返回匹配的次数
f. string preg_quote(string str[,string delimiter]) 将str中的所有特殊字符自动转义, delimiter字符串指定的所有字符也将被转义(即加上一个‘\’)
g.mixed preg_replace(mixed pattern, mixed replacement,mixed str[,int limit]) 使用pattern在str中匹配,将匹配的子串替代为replacement,最多替代limit次
h.mixed preg_replace(mixed pattern, callback ck,mixed str[,int limit]) 与上述函数相同,但是是使用ck函数的返回值来替代,ck的入参是一个数组,该数组是每一个匹配返回的所有分组
i.array preg_split(string pattern,string str[,int limit]) 使用pattern模式分割str。
10.数组
print_r(mixed)可以打印数组
each()和list()
explode()字符串拆分成数组
implode()数组组合成字符串
int count(array[,int mode]) 统计数组元素个数(mode==1递归统计)
mixed array_search(key,array) 在array中查找键值,如果找到返回键值;否则返回FALSE
mixed array_pop(array) 获取并删除数组中的最后一个元素,如果数组为空则返回null
int array_push(array,mixed v1[,v2,...]) 向数组尾部插入元素,并返回数组中的元素总数
array array_unique(array) 删除数组中重复的元素
11.php与web表单交互数据
a.表单用于浏览器发送数据到服务器,并使用action指明使用哪个url进行表单数据的处理。浏览器的数据只能通过表单来传送。表单的元素较多:checkbox,submit,reset,button,textarea...
b.GET和POST提交表单的区别:使用GET提交的表单将会将表单数据作为参数附加到url中进行提交;而POST方法不会。
c.关于全局变量$_POST,$_GET,$_SESSION
$_POST:数组格式,POST方法传递表单,使用表单元素的元素名获取元素值:$_POST['user'] .
$_GET :数组格式,GET方法传递表单,使用表单元素的元素名获取元素值:$_GET['user']
$_SESSION:session传参获取变量。使用表单元素的元素名获取元素值:$_SESSION['user']
根据表单元素的不同,传回来的'user'键对应的值有可能是一个数组
d.在web中嵌入php脚本的方法只有2种:
使用HTML标记编写php脚本;对表单元素的value属性进行赋值
include("index.php");//可以引用外部文件解耦合,多次引用将多次包含,如果只引用一次可以使用require_once
require_once("index.php"); //require
?>
$hidden="yg0025";
?>
$re=require("...")函数及其变种都具有返回值,返回调用的php文件中return函数的值
return "hello";
?>
include 和require的执行过程都是先将代码原本的拷贝到当前文件再执行。
return的效果也可以理解成将代码返回。return后面的代码将不会被拷贝。
这种拷贝有一个缺陷就是:同名变量或类有可能产生错误。
12.php与JavaScript交互
a.js的一些常识
js是一种由浏览器运行解析的脚本(也可以由服务器执行)。可以在不与服务器交互的条件下实现动态网页。
事件驱动:js是基于对象的语言。采用了事件驱动,当激发了某些事件时将执行相应的js代码。
js事件相应模式:
js的常用事件:onclick,ondblclick,onmousedown,...可以在网上查询js常用事件
与html解耦合: 包含外部文件
在页面底部(
之前)引入js脚本,原因:由于js加载阻塞页面,而HTML是下载多少渲染多少,因此我们把它至于页面底部,让UI线程先执行完再加载js脚本
13.日期与时间
14.cookie与session
cookie:
a.cookie是从一个web页面到下一个web页面的数据传递方法,存储在客户端;session是让数据在页面中持续有效的方法,存储在服务器端。功能:记录访客的信息;在页面之间传递变量;将所查看的Internet页缓存在cookie临时文件夹中;
b.php设置cookie
必须写在文件开头
setcookie("tmcookie","www.baidu.com");//生命周期默认为浏览器会话周期
setcookie("tmcookie","www.baidu.com",time()+60);//有效期60秒
setcookie("tmcookie","www.baidu.com",time+60,"/tm/",".baidu.com",1); //设置有效目录和域名
setcookie("tmcookie","",time()-1);//删除cookie
?>
浏览器会定时清流cookie,即使是未过期cookie也可能在cookie容量满时被清理
session
a.session以随机且唯一的session_id为文件名保存在服务器的文件中,该session_id则是保存在cookie中
写session:
session_start();
$_SESSION["admin"]="hello";//完成写session
?>
读session
if(!empty($_SESSION['admin'])) //将判断cookie中是否存在session_id和‘admin’字段,否则均返回null
$user=$_SESSION['admin']
?>
删除session
unset($_SESSION['admin']);
$_SESSION=array();//删除所有session
session_destory();//彻底销毁会话,确定会话结束时,应该这么做
b.session的过期时间(只有存在cookie时才能使用)
i.session_set_cookie_params将设置session_id的过期时间
session_set_cookie_params(1*60);
session_start();
$_SESSION["admin"]='hello'
?>
ii.setcookie设置session_id的过期时间
session_start();
setcookie(session_name(),session_id(),time()+60,'/');
$_SESSION["admin"]='hello'
?>
c.session只能使用当前session,如果想用上一个session,那是不可能的,因为无法得知session id。
d.session_id的4种传递方式
i.通过cookie传递,默认.需要客户端浏览器打开cookie。
ii.设置php.ini中的session.use_trans_sid=1,让PHP自动跨页面传递session_id
iii.通过GET方法,隐藏表单传递session_id
iv.使用文件或者数据库存储session_id,在页面间传递中手动调用
15.php的图形图像处理技术
16.php文件处理
17.php面向对象
a.定义
与c++相似
final class demo{
public function __construct(){ //构造函数
echo __METHOD__.":".__LINE__."\n";
}
public function func($param){ //普通函数
$param++;
echo "method func $paramn";
}
public function __destruct(){ //析构函数
echo __METHOD__.":".__LINE__."\n";
echo $this->sex;
}
//public $name = 123+456; 错误:初始化时不能带有计算
static $a = '$a';
const A = 'A';
public $name = '凤姐';
protected $sex = '男+女';
private $age = 23;
}
类的构造及成员的调用:$demo = new demo(); $demo->func(1);
成员的可见性有:public protected private 3种
其它修饰符:static final const
成员的调用方式: $this->property
b.类中的魔术方法(具有一定意义的方法)
i. 魔术方法必须被定义为公共的,所有其他魔术方法都必须如此
ii. 从PHP 5以后的版本,PHP中的类就可以使用魔术方法了。其规定以两个下划线(__)开头的方法都保留为魔术方法,所以建议大家函数名最好不用__开头,除非是为了重载已有的魔术方法,接下来列出一些魔术方法,如果大家想详细了解可以针对某一个进行查询了解,这里就不大篇幅的介绍了。
b1.__construct() 构造方法
__destruct()析构方法
b2.__autoload() 自动加载魔术方法。有的时候,在文件众多的项目中,要一一将所需类的文件都 include 进来,PHP 提供了 __autoload()方法,它会在试图使用尚未被定义的类时自动调用。 通过调用此函数,脚本引擎在PHP 出错失败前有了最后一个机会加载所需的类。
加入在Person.php中存在Person类,则当在另一个文件中调用时可以这样:
function __autoload($class_name)
{
require_once $class_name.'.php';
}
//当前页面 Pserson 类不存在则自动调用 __autoload() 方法,传入参数 Person
$p1 = new Person("张三","20");
$p1 -> say();
?>
b3.__get() 当调用一个未定义的属性时,此方法会被触发,传递的参数是被访问的属性名。
__set() 给一个未定义的属性赋值时,此方法会被触发,传递的参数是被设置的属性名和值。 这里的没有声明包括当使用对象调用时,访问控制为proteced,private的属性(即没有权限访问的属性)。
__isset() 当在一个未定义的属性上调用isset()函数时调用此方法
__unset() 当在一个未定义的属性上调用unset()函数时调用此方法
class Person {
private $name;
private $sex;
private $age;
//__set()方法用来设置私有属性
function __set($property_name, $value) { //在属性赋值时会被调用
echo "在直接设置私有属性值的时候,自动调用了这个 __set() 方法为私有属性赋值 ";
$this->$property_name = $value;
}
//__get()方法用来获取私有属性
function __get($property_name) {
echo "在直接获取私有属性值的时候,自动调用了这个 __get() 方法 ";
return isset($this->$property_name) ? $this->$property_name : null;
}
}
$p1=new Person();
$p1->name = "张三";
echo "我的名字叫:".$p1->name;
?>
运行该例子,输出:
在直接设置私有属性值的时候,自动调用了这个 __set() 方法为私有属性赋值
在直接获取私有属性值的时候,自动调用了这个 __get() 方法
我的名字叫:张三
b4.__call( $method, $arg_array ) 当调用一个未定义的方法是调用此方法,这里的未定义的方法包括没有权限访问的方法;如果方法不存在就去父类中找这个方法,如果父类中也不存在就去调用本类的__call()方法,如果本类中不存在__call()方法就去找父类中的__call()方法。
b5.__clone()如果想复制一个对象则需要使用clone方法
如果想在克隆后改变原对象的内容,需要在类中添加一个特殊的 __clone() 方法来重写原本的属性和方法。__clone() 方法只会在对象被克隆clone的时候自动调用。
class Person {
private $name;
private $age;
function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}
function say() {
echo "我的名字叫:".$this->name;
echo " 我的年龄是:".$this->age." ";
}
function __clone() {
$this->name = "我是假的".$this->name;
$this->age = 30;
}
}
$p1 = new Person("张三", 20);
$p1->say();
$p2 = clone $p1;
$p2->say();
?>
b6.
__toString()方法在将一个对象转化成字符串时自动调用,比如使用echo打印对象时
__sleep() 串行化的时候用
__wakeup 反串行化的时候调用
__set_state()当调用var_export()时,这个静态 方法会被调用(自PHP 5.1.0起有效)
__invoke当尝试以调用函数的方式调用一个对象时,__invoke 方法会被自动调用。
__callStatic(PHP 5.3.0以上版本有效) 是为了处理静态方法调用
c.继承与多态
c1.范围解析操作符(::)
作用:范围解析操作符或者更简单地说是一对冒号,可以用于访问静态成员,类常量,还可以用于覆盖类中的属性和方法。self,parent 和 static这三个特殊的关键字是用于在类定义的内部对其属性或 方法进行访问的。范围解析操作符(::)与类名连用,可以用于访问静态成员、方法和常量;与parent连用,可以访问被覆盖类中的成员和方法。
class MyClass
{
protected function myFunc() {
echo "MyClass::myFunc()\n";
}
}
class OtherClass extends MyClass
{
// 覆盖了父类的定义
public function myFunc()
{
// 但还是可以调用父类中被覆盖的方法
parent::myFunc();
echo "OtherClass::myFunc()\n";
}
}
$class = new OtherClass();
$class->myFunc();
/**
* 输出结果 ->
* MyClass::myFunc()
* OtherClass::myFunc()
*/
function mycall(MyClass $a){ //函数的入参可以指明类型也可以不指明
$a->myFunc();
}
mycall(new OtherClass()); 多态
?>
c2.接口interface与实现implements
class 子类 extends 父类 implemtns 接口1, 接口2, ...
{
......
}
interface User{
function getDiscount();
function getUserType();
}
//VIP用户 接口实现
class VipUser implements User{
// VIP 用户折扣系数
private $discount = 0.8;
function getDiscount() {
return $this->discount;
}
function getUserType() {
return "VIP用户";
}
}
d.对象的序列化与反序列化->存储
序列化完整过程包括两个步骤:一个是序列化,就是把对象转化为二进制的字符串,serialize() 函数用于序列化一个对象;另一个是反序列化,就是把对象被序列转化的二进制字符串再转化为对象,unserialize() 函数来反序列化一个被序列化的对象。这样整个过程下来,对象内的类型结构及数据都是 完整的。
$p1 = new Person("张三", 20);
$p1_string = serialize($p1);
//将对象序列化后写入文件
$fh = fopen("p1.text", "w");
fwrite($fh, $p1_string);
fclose($fh);
$p2 = unserialize(file_get_contents("p1.text"));
$p2 -> say();
?>
18.php 加密技术
19.php操作mysql数据库
resource mysql_connect("hostname","username","password"); //成功返回连接conn,失败返回null
mysql_select_db(string dbname[,resource conn]);//选择使用的数据库 mysql_query("dbname"[,conn])
$result=mysql_query(string query[,resource conn]);//适合所有sql语句,语句中不能加";"
$info=mysql_fetch_array($result[,int result_type]); 从数组结果中获取递归一行信息,返回数组;如果是select则$info的键为字段的名字,如果到底尾部则false
$info=mysql_fetch_object($result[,int result_type]); 获取一行作为对象,成员为字段名
$info=mysql_fetch_row($result[,int result_type]); 返回数组,但是是以下标索引的。
int mysql_num_rows()获取查询结果中总的记录数
20.php的PDO
a.支持的数据库
PDO支持MS SQL SERVER,MYSQL,ODBC,ORACLE,POSTGRE SQL等。
需要的php版本:php5.1以上
b.当数据库发生变化时只需要修改PDO的DSN数据源名称
c.PDO连接mysql
$dbh = new PDO('mysql:host=localhost;dbname=test', 'root', 'nsfocus123');
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "INSERT INTO user VALUES ('5', 'xiaohua');";
$stmt = $dbh->prepare($sql);
$stmt->execute();
echo $dbh->lastinsertid();
$sql = "SELECT * FROM user";
$stmt = $dbh->prepare($sql);
$stmt->execute();
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ // print_r($stmt->fetchAll() 以列名为索引的数组
print_r($row);
}
关于fetch的参数取值:
PDO::FETCH_ASSOC 从结果集中获取以列名为索引的关联数组。
PDO::FETCH_NUM 从结果集中获取一个以列在行中的数值偏移量为索引的值数组。
PDO::FETCH_BOTH 这是默认值,包含上面两种数组。
PDO::FETCH_OBJ 从结果集当前行的记录中获取其属性对应各个列名的一个对象。
PDO::FETCH_BOUND 使fetch()返回TRUE,并将获取的列赋给在bindParm()方法中指 定的相应变量。
PDO::FETCH_LAZY 创建关联数组和索引数组,以及包含列属性的一个对象,从而可以在这三种接口中任选一种。
21.ThinkPHP架构
22.一些有用的函数
a.trigger_error("输出信息", E_USER_ERROR);触发fatal错误,并退出程序执行
b.exit(0); 退出当前进程
c.$pid = pcntl_fork(); 创建子进程,需要pcntl模块
23.php的模块安装方法
a.下载需要安装的源码,编译生成.so或.dll
b.将动态库复制到php安装目录下的ext目录中
c.修改安装目录下的php.ini配置文件,在[php]字段中添加 extension=***.so
e.php -m |grep *** 查看模块是否安装成功