一、数组
1、数组定义
数组就是一个键值对组成的语言结构,键类似于酒店的房间号,值类似于酒店房间里存储的东西。
$arr=array();表示创建一个空数组,并把创建的空数组赋值给变量$arr。
print_r($arr)打印数组
2、PHP数组之索引数组初始化
php数组,根据索引值的不同分为两种:索引数组、关联数组。
索引和关联两个词都是针对数组的键而言的。
索引数组是指数组的键是整数的数组,并且键的整数顺序是从0开始,依次类推。
$fruit = array("苹果","香蕉","菠萝");注意数组的键是从0开始的。可以使用print_r($fruit);语句输出数组键及对应的值。
<?php
$fruit=array("苹果","香蕉","菠萝");
print_r($fruit); //Array([0] => 苹果[1] => 香蕉[2] => 菠萝)
?>
3、PHP数组之索引数组赋值
索引数组赋值有三种方式:
第一种:用数组变量的名字后面跟一个中括号的方式赋值,当然,索引数组中,中括号内的键一定是整数。比如,$arr[0]='苹果';
第二种:用array()创建一个空数组,使用=>符号来分隔键和值,左侧表示键,右侧表示值。当然,索引数组中,键一定是整数。比如,array('0'=>'苹果');
第三种:用array()创建一个空数组,直接在数组里用英文的单引号'或者英文的双引号"赋值,数组会默认建立从0开始的整数的键。比如array('苹果');这个数组相当于array('0'=>'苹果');
4、PHP数组之访问索引数组内容
有的时候我们需要把数组中的内容也就是值取出来该怎么办呢?用数组变量的名字后跟的中括号中的键,来访问数组中的值。
<?php
$fruit = array('苹果','香蕉');
$fruit0 = $fruit['0'];
print_r($fruit0);//结果为苹果
?>
上面代码的作用:先把一个数组$fruit第一个值取出来然后赋给一个变量$fruit0,最后输出变量值。
5、PHP数组之for循环访问索引数组里的值
for循环可以将数组里的所有值都访问到,下面我们展示下,用for循环访问索引数组里的值。
<?php
$fruit=array('苹果','香蕉','菠萝');
for($i=0; $i<3; $i++){
echo '<br/>数组第'.$i.'值是:'.$fruit[$i];
}
6、PHP数组之foreach循环访问索引数组里的值
foreach循环可以将数组里的所有值都访问到,下面我们展示下,用foreach循环访问索引数组里的值。
<?php
$fruit=array('苹果','香蕉','菠萝');
foreach($fruit as $k=>$v){
echo '<br/>第'.$k.'值是:'.$v;
}
?>
7、PHP数组之关联数组初始化
关联数组是指数组的键是字符串的数组。
$fruit = array(
'apple'=>"苹果",
'banana'=>"香蕉",
'pineapple'=>"菠萝"
);
可以使用print_r($fruit);语句输出数组键及对应的值。
8、PHP数组之关联数组赋值
关联数组赋值有两种方式:
第一种:用数组变量的名字后面跟一个中括号的方式赋值,当然,关联数组中,中括号内的键一定是字符串。比如,$arr['apple']='苹果';
第二种:用array()创建一个空数组,使用=>符号来分隔键和值,左侧表示键,右侧表示值。当然,关联数组中,键一定是字符串。比如,array('apple'=>'苹果');
9、PHP数组之访问关联数组内容
用数组变量的名字后跟中括号+键的方式来访问数组中的值,键使用单引号或者双引号括起来。
$fruit = array('apple'=>"苹果",'banana'=>"香蕉",'pineapple'=>"菠萝");
$fruit0 =$fruit['banana'];
print_r($fruit0);
10、PHP数组之foreach循环访问关联数组里的值
$fruit=array('apple'=>"苹果",'banana'=>"香蕉",'pineapple'=>"菠萝");
foreach($fruit as $k=>$v){
echo '<br/>水果的英文键名:'.$k.',对应的值是:'.$v;
}
11.使用range( )建立一个包含指定范围单元的数组
$num=range(1,10);
print_r($num);
$letter=range("a","z");
print_r($letter);
12.unset( )删除数组元素
$arr=array("city1"=>"北京","city2"=>"上海","city3"=>"深圳");
unset($arr["city3"]);
print_r($arr);//打印新的数组
13.count( )取得数组的长度
$arr=array("city1"=>"北京","city2"=>"上海","city3"=>"深圳");
echo count($arr);
14.in_array("北京",$arr)检查数组中是否包含某个值
第一个参数是要判断的值,第二个参数是要判断的数组,返回值是一个布尔值
arr=array("city1"=>"北京","city2"=>"上海","city3"=>"深圳");
var_dump(in_array("北京", $arr));
15.sort()根据首字母来进行正向的排序,根据值进行排序
$arr=array("a","z","g","t");
sort($arr);
print_r($arr);
rsort()根据首字母来进行反向的排序,根据值进行排序
16.根据索引进行排序
ksort()根据索引进行升序排序
krsort()根据索引进行降序排序
$arr=array("c"=>"d2c","g"=>"ff545g","f"=>"5435f","a"=>"8675a");
ksort($arr);//ksort()根据索引进行升序排序
print_r($arr);
krsort($arr);//krsort()根据索引进行降序排序
print_r($arr);
17.二维数组
$arr=array("city1"=>"北京","city2"=>"上海","city3"=>array("拉萨","普罗旺斯"));
foreach($arr as $k => $v) {
if($k != "city3"){
echo "<br/>";
echo $v;
}else{
//双层循环数组
foreach($v as $kk=>$vv){
echo "<br/>";
echo $vv;}}}
//循环多维数组
//引入文件
include "adress.php";
foreach($adress as $k => $v) {
echo"省名:". $v["province_name"]."<br/>";
if(!empty($v["city"])) {
foreach($v["city"] as $key => $val) {
echo" 市名:". $val["city_name"]."<br/>";
if(!empty($val["area"])) {
foreach($val["area"] as $kk => $vv) {
echo" 区名:". $vv."<br/>";}}}}}
二、函数
1、php自定义函数
PHP内置了超过1000个函数,因此函数使得PHP成为一门非常强大的语言。大多数时候我们使用系统的内置函数就可以满足需求,但是自定义函数通过将一组代码封装起来,使代码进行复用,程序结构与逻辑更加清晰。
PHP函数的定义方式:
1.使用关键字“function”开始
2.函数名可以是字母或下划线开头:function name()
3.在大括号中编写函数体:
function name() {
echo 'Eric';
}
通过上面的步骤,我们就定义了一个简单的函数,当我们需要的时候,就可以在代码中调用这个函数,调用方法为函数名+参数,例如:name();
调用的时候不区分大小写,不过在调用函数时,通常使用其在定义时的形式。
函数名称是由字母或下划线开始,中间可以包含数字
php不支持函数重载,所以自定义函数不能和内置函数重名
不能在一个文件中自定义同名的函数
局部变量:函数体内定义的变量为局部变量,只在函数体内可见
局部变量的作用域:从声明它的那条语句开始到函数结束
2、php函数的参数
PHP的函数可以没有参数,也可以有若干个参数,多个参数称之为参数列表,采用逗号进行分割,参数类似于一个变量,调用时用来传递数据到函数体中。通过传递参数可以使函数实现对参数的运算,得到我们想要的结果。
参数的变量名可以自由指定,但最好能够表达相关的意思,常用的设定参数的方法为:
function sum($a, $b) {
return $a+$b;
}
支持默认参数,如果不给参数,就会调用默认的参数
function test2($b="123"){
echo $b;
}
test2();
传值
$d=10;
function test3($c){$c=5;}
test($d);
echo $d;//打印结果是10,只传值,不传址
传址
$e=10;
function test4(&$f){$f=5;}
test4($e);//打印结果是5,加了&,引用同一个地址
echo $e;
3、php函数之返回值
使用return关键字可以使函数返回值,可以返回包括数组和对象的任意类型,如果省略了 return,则默认返回值为 NULL。
function add($a) {
return $a+1;
}
$b = add(1);
返回语句会立即中止函数的运行,并且将控制权交回调用该函数的代码行,因此下面函数的返回值跟上面的函数是一样的。
function add($a) {
return $a+1;
$a = 10;
return $a+20;
}
$b = add(1);
函数不能返回多个值,但可以通过返回一个数组来得到类似的效果。
function numbers() {
return array(1, 2, 3);
}
list ($one, $two, $three) = numbers();
4、PHP函数之可变函数
所谓可变函数,即通过变量的值来调用函数,因为变量的值是可变的,所以可以通过改变一个变量的值来实现调用不同的函数。经常会用在回调函数、函数列表,或者根据动态参数来调用不同的函数。可变函数的调用方法为变量名加括号。
function name() {
echo 'jobs';
}
$func = 'name';
$func(); //调用可变函数
可变函数也可以用在对象的方法调用上。
class book {
function getName() {
return 'bookname';
}
}
$func = 'getName';
$book = new book();
$book->$func();
5、PHP函数之内置函数
内置函数指的是PHP默认支持的函数,PHP内置了很多标准的常用的处理函数,包括字符串处理、数组函数、文件处理、session与cookie处理等。
我们先拿字符串处理函数来举例,通过内置函数str_replace可以实现字符串的替换。下面的例子将“jobs”替换成“steven jobs”:
$str = 'i am jobs.';
$str1 = str_replace('jobs', 'steven jobs', $str);
echo $str1; //结果为“i am steven jobs”
另外一些函数是通过其他扩展来支持的,比如mysql数据库处理函数,GD图像处理函数,邮件处理函数等,PHP默认加载了一些常用的扩展库,我们可以安装或者加载其他扩展库来增加PHP的处理函数。
6 、PHP函数之判断函数是否存在
当我们创建了自定义函数,并且了解了可变函数的用法,为了确保程序调用的函数是存在的,经常会先使用function_exists判断一下函数是否存在。同样的method_exists可以用来检测类的方法是否存在。
function func() {
}
if (function_exists('func')){
echo "存在";
}
类是否定义可以使用class_exists。
lass MyClass{
}
// 使用前检查类是否存在
if (class_exists('MyClass')) {
$myclass = new MyClass();
}
PHP中有很多这类的检查方法,例如文件是否存在file_exists等。
$filename = 'test.txt';
if (!file_exists($filename)) {
echo $filename . ' not exists.';
}
7.函数的作用域,函数里面取不到外面的东西,作用域在函数内部有效,函数的里面的东西外面也取不到
$aa=10;//外面定义一个变量,在函数里面是访问不到的,可以通过传参取到外面的变量
function ccc(){
//echo $aa;
}
ccc();
通过global,取到外面的变量
$aa=10;
function cccc(){
global $aa;//申明$aa是一个全局变量
echo $aa;
}
cccc();
超全局变量,用$GLOBALS设置
function test(){
$a=10;
$GLOBALS["a"]=$a;//超全局变量
}
test();
echo $GLOBALS['a'];
详解global和$GLOBALS[]的区别:
1.$GLOBALS[‘var’]是外部的全局变量本身
2.global $var是外部$var的同名引用或者指针
<?php
$var1 = 1;
$var2 = 2;
function test(){
$GLOBALS[‘var2′] = &$GLOBALS[‘var1′];
}
test();
echo $var2;//正常打印结果为1
?>
<?php
$var1 = 1;
$var2 = 2;
function test(){
global $var1,$var2;
$var2 = &$var1;
}
test();
echo $var2;//意外打印结果为2.为什么会打印结果为2呢?其实就是因为$var1的引用指向了$var2的引用地址。导致实质的值没有改变。
?>
我们再来看一个例子吧。
<?php
$var1 = 1;
function test(){
unset($GLOBALS[‘var1′]);
}
test();
echo $var1;//因为$var1被删除了,所以什么东西都没有打印
?>
<?php
$var1 = 1;
function test(){
global $var1;
unset($var1);
}
test();
echo $var1;//意外的打印了1。证明删除的只是别名|引用,其本身的值没有受到任何的改变.
明白了吧?也就是说global $var其实就是$var = &$GLOBALS[‘var’]。调用外部变量的一个别名而已
?>
8.函数递归,方法一
$num=1;
function test($num){
$num++;
if($num<5){
echo $num;
test($num);//递归,满足条件调用函数
}else{
return;
}
}
test($num);//把$num当做参数传到函数里面去
用递归处理阶乘问题
function factorial($num){
if($num>0){
return $num*factorial($num-1);
}else{
return 1;}}
echo factorial(5);//调用,打印
9.函数递归,方法二,静态变量
静态变量(每次调用完成后会记住上一次的值),也叫常驻内存,关键字是static
function test(){
static $num=1;
$num++;
if($num<5){
echo $num;
test();
}else{
return;}}
test();
三、PHP类与面向对象
1.php类和对象
类是面向对象程序设计的基本概念,通俗的理解类就是对现实中某一个种类的东西的抽象, 比如汽车可以抽象为一个类,汽车拥有名字、轮胎、速度、重量等属性,可以有换挡、前进、后退等操作方法。
通常定义一个汽车类的方法为:
class Car {
var $name = '汽车';
function getName() {
return $this->name;
}}
类是一类东西的结构描述,而对象则是一类东西的一个具体实例,例如汽车这个名词可以理解为汽车的总类,但这辆汽车则是一个具体的汽车对象。
对象通过new关键字进行实例化:
$car = new Car();
echo $car->getName();
类与对象看起来比较相似,但实际上有本质的区别,类是抽象的概念,对象是具体的实例。类可以使程序具有可重用性。
<?php
//定义一个类
class Car {
var $name = '汽车';
function getName() {
return $this->name;
}
}
//实例化一个car对象
$car = new Car();
$car->name = '奥迪A6'; //设置对象的属性值
echo $car->getName(); //调用对象的方法 输出对象的名字
?>
2.PHP类和对象之创建一个对象
类的定义方法,类通过关键字class开头,然后是类名与花括号,在花括号中定义类的属性与方法。类名必须是字母或下划线开头,后面紧跟若干个字母、数字或下划线,类名最好能够表意,可以采用名词或者英文单词。
/定义一个类
class Car {
//定义属性
public $name = '汽车';
//定义方法
public function getName() {
//方法内部可以使用$this伪变量调用对象的属性或者方法
return $this->name;
}
}
要创建一个类的实例,可以使用new关键字创建一个对象。
$car = new Car();
//也可以采用变量来创建
$className = 'Car';
$car = new $className();
3.PHP类和对象之类的属性
在类中定义的变量称之为属性,通常属性跟数据库中的字段有一定的关联,因此也可以称作“字段”。属性声明是由关键字 public,protected 或者 private 开头,后面跟一个普通的变量声明来组成。属性的变量可以设置初始化的默认值,默认值必须是常量。
访问控制的关键字代表的意义为:
public:公开的
protected:受保护的
private:私有的
class Car {
//定义公共属性
public $name = '汽车';
//定义受保护的属性
protected $corlor = '白色';
//定义私有属性
private $price = '100000';
}
默认都为public,外部可以访问。一般通过->对象操作符来访问对象的属性或者方法,对于静态属性则使用::双冒号进行访问。当在类成员方法内部调用的时候,可以使用$this伪变量调用当前对象的属性。
$car = new Car();
echo $car->name; //调用对象的属性
echo $car->color; //错误 受保护的属性不允许外部调用
echo $car->price; //错误 私有属性不允许外部调用
受保护的属性与私有属性不允许外部调用,在类的成员方法内部是可以调用的。
class Car{
private $price = '1000';
public function getPrice() {
return $this->price; //内部访问私有属性
}}
4.PHP类和对象之定义类的方法
方法就是在类中的function,很多时候我们分不清方法与函数有什么差别,在面向过程的程序设计中function叫做函数,在面向对象中function则被称之为方法。
同属性一样,类的方法也具有public,protected 以及 private 的访问控制。
访问控制的关键字代表的意义为:
public:公开的
protected:受保护的
private:私有的
们可以这样定义方法:
class Car {
public function getName() {
return '汽车';
}
}
$car = new Car();
echo $car->getName();
使用关键字static修饰的,称之为静态方法,静态方法不需要实例化对象,可以通过类名直接调用,操作符为双冒号::。
class Car {
public static function getName() {
return '汽车';
}
}
echo Car::getName(); //结果为“汽车”
5.PHP类和对象之构造函数和析构函数
PHP5可以在类中使用__construct()定义一个构造函数,具有构造函数的类,会在每次对象创建的时候调用该函数,因此常用来在对象创建的时候进行一些初始化工作。
class Car {
function__construct(){
print "构造函数被调用\n";
}}
$car = new Car(); //实例化的时候 会自动调用构造函数__construct,这里会输出一个字符串
在子类中如果定义了__construct则不会调用父类的__construct,如果需要同时调用父类的构造函数,需要使用parent::__construct()显式的调用。
class Car {//父类
function __construct() {
print "父类构造函数被调用\n";
}
}
class Truck extends Car {//子类
function __construct() {
print "子类构造函数被调用\n";
parent::__construct();
}
}
$car = new Truck();
同样,PHP5支持析构函数,使用__destruct()进行定义,析构函数指的是当某个对象的所有引用被删除,或者对象被显式的销毁时会执行的函数。
class Car {
function __construct() {
print "构造函数被调用 \n";
}
function __destruct(){
print "析构函数被调用 \n";
}}
$car = new Car(); //实例化时会调用构造函数
echo '使用后,准备销毁car对象 \n';
unset($car); //销毁时会调用析构函数
6.PHP类和对象之Static静态关键字
静态属性与方法可以在不实例化类的情况下调用,直接使用类名::方法名的方式进行调用。静态属性不允许对象使用->操作符调用。
class Car {
private static $speed = 10;
public static function getSpeed() {
return self::$speed;
}
}
echo Car::getSpeed(); //调用静态方法
静态方法也可以通过变量来进行动态调用
$func = 'getSpeed';
$className = 'Car';
echo $className::$func(); //动态调用静态方法
静态方法中,$this伪变量不允许使用。可以使用self,parent,static在内部调用静态方法与属性。
class Car {
private static $speed = 10;
public static function getSpeed() {
return self::$speed;
}
public static function speedUp() {
return self::$speed+=10;
}}
class BigCar extends Car {
public static function start() {
parent::speedUp();
}}
BigCar::start();
echo BigCar::getSpeed();
7.PHP类和对象之访问控制
访问控制通过关键字public,protected和private来实现。被定义为公有的类成员可以在任何地方被访问。被定义为受保护的类成员则可以被其自身以及其子类和父类访问。被定义为私有的类成员则只能被其定义所在的类访问。
类属性必须定义为公有、受保护、私有之一。为兼容PHP5以前的版本,如果采用 var 定义,则被视为公有。
class Car {
$speed = 10;//错误 属性必须定义访问控制
public $name; //定义共有属性
}
类中的方法可以被定义为公有、私有或受保护。如果没有设置这些关键字,则该方法默认为公有。
class Car {
//默认为共有方法
function turnLeft() {
}
}
如果构造函数定义成了私有方法,则不允许直接实例化对象了,这时候一般通过静态方法进行实例化,在设计模式中会经常使用这样的方法来控制对象的创建,比如单例模式只允许有一个全局唯一的对象。
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(); //通过静态方法来获得一个实例
8、PHP类和对象之对象继承
继承是面向对象程序设计中常用的一个特性,汽车是一个比较大的类,我们也可以称之为基类,除此之外,汽车还分为卡车、轿车、东风、宝马等,因为这些子类具有很多相同的属性和方法,可以采用继承汽车类来共享这些属性与方法,实现代码的复用。
9、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;
方法的重载通过__call来实现,当调用不存在的方法的时候,将会转为参数调用__call方法,当调用不存在的静态方法时会使用__callStatic重载。
class Car {
public $speed = 0;
public function __call($name, $args) {
if ($name == 'speedUp') {
$this->speed += 10;
}
}
}
$car = new Car();
$car->speedUp(); //调用不存在的方法会使用重载
echo $car->speed;
10、PHP类和对象之对象的高级特性
对象比较,当同一个类的两个实例的所有属性都相等时,可以使用比较运算符==进行判断,当需要判断两个变量是否为同一个对象的引用时,可以使用全等运算符===进行判断。
class Car {
}
$a = new Car();
$b = new Car();
if ($a == $b) echo '=='; //true
if ($a === $b) echo '==='; //false
对象复制,在一些特殊情况下,可以通过关键字clone来复制一个对象,这时__clone方法会被调用,通过这个魔术方法来设置属性的值。
class Car {
public $name = 'car';
public function __clone() {
$obj = new Car();
$obj->name = $this->name;
}
}
$a = new Car();
$a->name = 'new car';
$b = clone $a;
var_dump($b);
对象序列化,可以通过serialize方法将对象序列化为字符串,用于存储或者传递数据,然后在需要的时候通过unserialize将字符串反序列化成对象进行使用。
class Car {
public $name = 'car';
}
$a = new Car();
$str = serialize($a); //对象序列化成字符串
echo $str.'<br/>';
$b = unserialize($str); //反序列化为对象
var_dump($b);
11.include和require
include() 语句将在其被调用的位置处包含一个文件
include_once()的作用与include()相同,不过它会首先验证是否已经包含了该文件,如果已经包含,则不再执行include_once()
include "031.php";//引入php文件
include "033.html";//引入html文件
echo $a;//可以直接取到引用的文件的里面的变量
require()与include()一样,只不过require()我们通常放在php程序的最前面
require_once与include_once()一样,但是也要放在php程序的最前面
include和require的区别:
require一个文件存在错误的话,那么程序就会中断执行了,并显示致命错误
include一个文件存在错误的话,那么程序不会中断,而是继续执行,并显示一个警告错误。
include (或 require)语句会获取指定文件中存在的所有文本/代码/标记,并复制到使用 include 语句的文件中。
包含文件很有用,如果您需要在网站的多张页面上引用相同的 PHP、HTML 或文本的话。