面向对象的基本概念,面向对象编程,oop,面向对象,面向对象的分析,面向对象的设计,面向对象的编程,什么是类。

类,属性和方法,类,对象,面向对象编程的三大特点。特点,封装性,继承性,多态性。

封装性,也可以称为信息隐藏。
继承性就是派生类(子类)自动继承一个或多个基类(父类)中的属性与方法,并可以重写或添加新的属性或方法。
多态性是指同一个类的不同对象,使用同一个方法可以获得不同的结果,这种技术称为多态性。

类的定义,成员方法,类的实例化,成员变量,类常量,构造方法和析构方法,继承和多态的实现,数据的隐藏,静态变量。

类的定义:

<?php
class SpoObject{            //定义类//…
}
?>

成员方法:

<?phpclass SportObject{function beatBasketball()($name,$height,$avoirdupois,$age,$sex){   //声明成员方法echo "姓名:".$name;  //方法实现的功能}}
?>

类的实例化:

对象名 -> 成员方法

成员变量
类中的变量,也称为成员变量

关键字 成员变量名
对象名 -> 成员变量

类常量
常量就是不会改变的量,是一个恒值。
定义常量使用关键字const
输出格式:

类名::常量名

构造方法和析构方法

void __construct([mixed args [,…]])
void __destruct ( void )

示例:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>成员变量</title>
<style type="text/css">
<!--
body,td,th {font-size: 12px;
}
body {margin-left: 10px;margin-top: 10px;margin-right: 10px;margin-bottom: 10px;
}
-->
</style></head>
<body>
<?php
class SportObject{public $name;                             //定义成员变量public $height;                             //定义成员变量public $avoirdupois;                        //定义成员变量public function bootFootBall($name,$height,$avoirdupois){               //声明成员方法$this->name=$name;$this->height=$height;$this->avoirdupois=$avoirdupois;if($this->height<185 and $this->avoirdupois<85){return $this->name.",符合踢足球的要求!";            //方法实现的功能}else{return $this->name.",不符合踢足球的要求!";            //方法实现的功能}}
}
$sport=new SportObject();          //实例化类,并传递参数
echo $sport->bootFootBall('1','185','80');                             //执行类中的方法
?></body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>成员方法</title>
<style type="text/css">
<!--
body,td,th {font-size: 12px;
}
body {margin-left: 10px;margin-top: 10px;margin-right: 10px;margin-bottom: 10px;
}
-->
</style></head>
<body>
<?phpclass SportObject{function beatBasketball($name,$height,$avoirdupois,$age,$sex){                //声明成员方法if($height>180 and $avoirdupois<=100){return $name.",符合打篮球的要求!";            //方法实现的功能}else{return $name.",不符合打篮球的要求!";         //方法实现的功能}}}$sport=new SportObject();echo $sport->beatBasketball('1','185','80','20周岁','男');
?>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>常量</title>
<style type="text/css">
<!--
body,td,th {font-size: 12px;
}
body {margin-left: 10px;margin-top: 10px;margin-right: 10px;margin-bottom: 10px;
}
-->
</style></head>
<body>
<?php
class SportObject{const BOOK_TYPE = '计算机图书';public $object_name;                     //图书名称function setObjectName($name){                //声明方法setObjectName()$this -> object_name = $name;          //设置成员变量值}function getObjectName(){                 //声明方法getObjectName()return $this -> object_name;}
}
$c_book = new SportObject();                       //实例化对象
$c_book -> setObjectName("PHP类");              //调用方法setObjectName
echo SportObject::BOOK_TYPE."->";                  //输出常量BOOK_TYPE
echo $c_book -> getObjectName();             //调用方法getObjectName
?>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>构造方法</title>
<style type="text/css">
<!--
body,td,th {font-size: 12px;
}
body {margin-left: 10px;margin-top: 10px;margin-right: 10px;margin-bottom: 10px;
}
-->
</style></head>
<body>
<?php
class SportObject{public $name;                             //定义成员变量public $height;                             //定义成员变量public $avoirdupois;                        //定义成员变量public $age;                                //定义成员变量public $sex;                                //定义成员变量public function __construct($name,$height,$avoirdupois,$age,$sex){              //定义构造方法$this->name=$name;                      //为成员变量赋值$this->height=$height;                 //为成员变量赋值$this->avoirdupois=$avoirdupois;       //为成员变量赋值$this->age=$age;                       //为成员变量赋值$this->sex=$sex;                       //为成员变量赋值}public function bootFootBall(){               //声明成员方法if($this->height<185 and $this->avoirdupois<85){return $this->name.",符合踢足球的要求!";            //方法实现的功能}else{return $this->name.",不符合踢足球的要求!";            //方法实现的功能}}
}
$sport=new SportObject('1','185','80','20','男');         //实例化类,并传递参数
echo $sport->bootFootBall();                             //执行类中的方法?></body>
</html>

析构方法,是对象被销毁时被调用的,作用是释放内存。

void __destruct ( void )
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>析构方法</title>
</head>
<body>
<?php
class SportObject{public $name;                             //定义成员变量public $height;                             //定义成员变量public $avoirdupois;                        //定义成员变量public $age;                                //定义成员变量public $sex;                                //定义成员变量public function __construct($name,$height,$avoirdupois,$age,$sex){              //定义构造方法$this->name=$name;                      //为成员变量赋值$this->height=$height;                 //为成员变量赋值$this->avoirdupois=$avoirdupois;       //为成员变量赋值$this->age=$age;                       //为成员变量赋值$this->sex=$sex;                       //为成员变量赋值}public function bootFootBall(){               //声明成员方法if($this->height<185 and $this->avoirdupois<85){return $this->name.",符合踢足球的要求!";            //方法实现的功能}else{return $this->name.",不符合踢足球的要求!";            //方法实现的功能}}function __destruct(){echo "<p><b>对象被销毁,调用析构函数。</b></p>";}
}
$sport=new SportObject('1','185','80','20','男');         //实例化类,并传递参数
//unset($sport);    ?>
</body>
</html>

继承和多态的实现

所有成员变量和方法
构造函数
先调用子类中的方法
去调用父类中的构造方法

class subClass extends superClass{
…
}

多态存在两种形式:覆盖和重载。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>继承的实现</title>
<style type="text/css">
</head>
<body>
<?php
/*  父类  */
class SportObject{public $name;                             //定义姓名成员变量public $age;                              //定义年龄成员变量public $avoirdupois;                      //定义体重成员变量public $sex;                              //定义性别成员变量public function __construct($name,$age,$avoirdupois,$sex){                //定义构造方法$this->name=$name;                      //为成员变量赋值$this->age=$age;                       //为成员变量赋值$this->avoirdupois=$avoirdupois;       //为成员变量赋值$this->sex=$sex;                       //为成员变量赋值}function showMe(){                            //定义方法echo '这句话不会显示。';}
}
/*  子类BeatBasketBall  */
class BeatBasketBall extends SportObject{               //定义子类,继承父类public $height;                                       //定义身高成员变量function __construct($name,$height){              //定义构造方法$this -> height = $height;                      //为成员变量赋值$this -> name = $name;                         //为成员变量赋值}function showMe(){                                    //定义方法if($this->height>185){return $this->name.",符合打篮球的要求!";          //方法实现的功能}else{return $this->name.",不符合打篮球的要求!";            //方法实现的功能}}
}
/*  子类WeightLifting  */
class WeightLifting extends SportObject{                        //继承父类function showMe(){                                            //定义方法if($this->avoirdupois<85){return $this->name.",符合举重的要求!";               //方法实现的功能}else{return $this->name.",不符合举重的要求!";         //方法实现的功能}}
}//实例化对象
$beatbasketball = new BeatBasketBall('','190');                //实例化子类
$weightlifting = new WeightLifting('','185','80','20','男');
echo $beatbasketball->showMe()."<br>";                           //输出结果
echo $weightlifting->showMe()."<br>";
?>
</body>
</html>

继承的实现

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>继承的实现</title>
<style type="text/css">
</head>
<body>
<?php
/*  父类  */
class SportObject{public $name;                             //定义姓名成员变量public $age;                              //定义年龄成员变量public $avoirdupois;                      //定义体重成员变量public $sex;                              //定义性别成员变量public function __construct($name,$age,$avoirdupois,$sex){                //定义构造方法$this->name=$name;                      //为成员变量赋值$this->age=$age;                       //为成员变量赋值$this->avoirdupois=$avoirdupois;       //为成员变量赋值$this->sex=$sex;                       //为成员变量赋值}function showMe(){                            //定义方法echo '这句话不会显示。';}
}
/*  子类BeatBasketBall  */
class BeatBasketBall extends SportObject{               //定义子类,继承父类public $height;                                       //定义身高成员变量function __construct($name,$height){              //定义构造方法$this -> height = $height;                      //为成员变量赋值$this -> name = $name;                         //为成员变量赋值}function showMe(){                                    //定义方法if($this->height>185){return $this->name.",符合打篮球的要求!";          //方法实现的功能}else{return $this->name.",不符合打篮球的要求!";            //方法实现的功能}}
}
/*  子类WeightLifting  */
class WeightLifting extends SportObject{                        //继承父类function showMe(){                                            //定义方法if($this->avoirdupois<85){return $this->name.",符合举重的要求!";               //方法实现的功能}else{return $this->name.",不符合举重的要求!";         //方法实现的功能}}
}//实例化对象
$beatbasketball = new BeatBasketBall('','190');                //实例化子类
$weightlifting = new WeightLifting('','185','80','20','男');
echo $beatbasketball->showMe()."<br>";                           //输出结果
echo $weightlifting->showMe()."<br>";
?>
</body>
</html>

重载:
传递的参数个数不同,调用不同的方法,返回不同的值。

<?php class C{function __call($name,$num){        //调用不存在的方法echo "方法名称:" . $name . "<p>";        //输出方法名echo "参数存在个数:" . count($num) . "<p>";   //输出参数个数if (count($num) == 1){    //根据参数个数调用不同的方法echo $this->list1($a);    }if (count($num) == 2){   //根据参数个数调用不同的方法echo $this->list2($a,$b);}}public function list1($a){     //定义方法return "这是list1函数";}public function list2($a,$b){   //定义方法return "这是list2函数";}}
$a = new C;                    //类的实例化
$a->listshow(1,2);               //调用方法,传递参数
?>
关键字::变量名/常量名/方法名
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>伪变量$this</title>
</head>
<body>
<?phpclass example{function exam(){if(isset($this)){echo '$this的值为:'.get_class($this);}else{echo '$this未定义';}}}$class_name = new example();$class_name->exam();
?>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>“::”操作符</title>
</head>
<body>
<?php
class Book{const NAME = 'computer';                          //常量NAMEfunction __construct(){                             //构造方法echo '本月图书类冠军为:'.Book::NAME.' ';       //输出默认值}
}
class l_book extends Book{                              //Book类的子类const NAME = 'foreign language';                   //声明常量function __construct(){                               //子类的构造方法parent::__construct();                         //调用父类的构造方法echo '本月图书类冠军为:'.self::NAME.' ';      //输出本类中的默认值}
}
$obj = new l_book();                                   //实例化对象
?>
</body>
</html>

parent: 可以调用父类中的成员变量,成员方法和常量。

self:可以调用当前类中的静态成员和常量。

类名:可以调用本类中的变量,常量和方法。

数据隐藏

public(公共成员)
private(私有成员)
protected(保护成员)

public, private, protected, static, final

静态变量(方法)

关键字::静态成员
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>private关键字</title>
</head>
<body>
<?php
class Book{private $name = 'computer';                           //声明私有变量$namepublic function setName($name){                        //设置私有变量$this -> name = $name;}public function getName(){                           //读取私有变量return $this -> name;}
}
class LBook extends Book{                               //Book类的子类
}
$lbook = new LBook();                                  //实例化对象
echo '正确操作私有变量的方法:';
$lbook -> setName("PHP");                  //对私有变量进行操作
echo $lbook -> getName();
echo '<br>直接操作私有变量的结果:';                 //对私有变量进行操作
echo Book::$name;
?>
</body>
</html>

private只能在所属类的内部被调和修改,不可以在类外被访问。

protected修饰的类成员,可以在本类和子类中被调用,其他地方不可以被调用。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>protected关键字</title>
</head>
<body>
<?php
class Book{protected $name = 'computer';                     //声明保护变量$name
}
class LBook extends Book{                               //Book类的子类public function showMe(){echo '对于protected修饰的变量,在子类中是可以直接调用的。如:$name = '.$this -> name;}
}
$lbook = new LBook();                                  //实例化对象
$lbook -> showMe();
echo '<p>但在其他的地方是不可以调用的,否则:';         //对私有变量进行操作
$lbook -> name = 'history';
?>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>protected关键字</title>
</head>
<body>
<?php
class Book{protected $name = 'computer';                     //声明保护变量$name
}
class LBook extends Book{                               //Book类的子类public function showMe(){echo '对于protected修饰的变量,在子类中是可以直接调用的。如:$name = '.$this -> name;}
}
$lbook = new LBook();                                  //实例化对象
$lbook -> showMe();
echo '<p>但在其他的地方是不可以调用的,否则:';         //对私有变量进行操作
$lbook -> name = '会报错,这里就错了';
?>
</body>
</html>

静态变量:

关键字::静态成员

self,在类内部调用 静态成员所使用

在静态方法中,只能调用静态变量,不能调用普通变量,而普通方法可以调用静态变量。

对象被销毁后,仍然保存被修改的静态数据。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>静态变量的使用</title>
</head>
<body>
<?php
class Book{                                     //Book类static $num = 0;                            //声明一个静态变量$num,初值为0public function showMe(){                 //申明一个方法echo '您是第'.self::$num.'位访客';        //输出静态变量self::$num++;                         //将静态变量加1}
}
$book1 = new Book();                           //实例化对象$book1
$book1 -> showMe();                              //调用showMe()方法
echo "<br>";
$book2 = new Book();                           //实例化对象$book2;
$book2 -> showMe();                              //再次调用showMe()方法
echo "<br>";
echo '您是第'.Book::$num.'为访客';                //直接使用类名调用静态变量
?>
</body>
</html>

运行效果是:

您是第0位访客
您是第1位访客
您是第2位访客

对象的高级应用

final关键字,抽象类,接口的使用,克隆对象,对象比较,对象类型检测,魔术方法。

不可以被继承,不能有子类
final class class_name{
//…
}final function method_name() 不可以重写和覆盖
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>final类</title>
></head>
<body>
<?phpfinal class SportObject{function  __construct(){echo '不能被继承,不能有子类';}}class MyBook extends SportObject{static function exam(){echo "会报错的";}}MyBook::exam();
?>
</body>
</html>

抽象类,是不能被实例化的类,只能作为父类来使用:

abstract class AbstractName{
…
}

抽象类,一样有成员变量,成员方法,抽象类至少包含一个抽象方法,抽象方法没有方法体,其功能在子类完成。

abstract function abstractName();
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>抽象类</title>
</head>
<body>
<?phpabstract class CommodityObject{                         //定义抽象类abstract function service($getName,$price,$num); //定义抽象方法}class MyBook extends CommodityObject{              //定义子类,继承抽象类function service($getName,$price,$num){      //定义方法echo '您购买的商品是'.$getName.',该商品的价格是:'.$price.' 元。';echo '您购买的数量为:'.$num.' 本。';echo '如发现缺页,请在3日内更换。';}}class MyComputer extends CommodityObject{         //定义子类继承父类function service($getName,$price,$num){           //定义方法echo '您购买的商品是'.$getName.',该商品的价格是:'.$price.' 元。';echo '您购买的数量为:'.$num.' 台。';echo '如发生非人为质量问题,请在3个月内更换。';}}$book = new MyBook();                  //实例化子类$computer = new MyComputer();           //实例化子类$book -> service('PHP',5,3);    //调用方法echo '<p>';$computer -> service('XX本',800,1);        //调用方法?>
</body>
</html>

接口

interface InterfaceName{function interfaceName1();function interfaceName2();…
}class SubClass implements InterfaceName1,InterfaceName2{function interfaceName1(){  //功能实现
}function interfaceName2(){ //功能实现
}…
}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>接口</title>
</head>
<body>
<?phpinterface MPopedom{function popedom();}interface MPurview{function purview();}class Member implements MPurview{function purview(){echo '会员';}}class Manager implements MPurview,MPopedom{function purview(){echo '管理员拥有全部权限。';}function popedom(){echo '管理员还没有的权限';}}$member = new Member();$manager = new Manager();$member -> purview();echo '<p>';$manager -> purview();$manager ->popedom();
?>
</body>
</html>

克隆对象

$object1 = new ClassName();
$object2 = clone $object1;

__clone()方法,调用__clone()方法,可以克隆出来的对象的一些行为及属性

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>对象的引用</title>
</head>
<body>
<?php
class SportObject{                                  //类SportObjectprivate $object_type = 'book';             //声明私有变量$object_type,并赋初值等于“book”public function setType($type){             //声明成员方法setType,为变量$object_type赋值$this -> object_type = $type;}public function getType(){                    //声明成员方法getType,返回变量$object_type的值return $this -> object_type;}
}
$book1 = new SportObject();                        //实例化对象$book1
$book2 = $book1;                               //使用普通数据类型的方法给对象$book2赋值
$book2 -> setType('computer');                 //改变对象$book2的值
echo '对象$book1的值为:'.$book1 -> getType();    //输出对象$book1的值
?></body>
</html>

对象比较
两个等号“”是比较两个对象的内容
3个等号“=”是比较对象的引用地址

对象类型检测
instanceof操作符可以检测当前对象是属于哪个类

ObjectName instanceof ClassName

魔术方法

__construct()、__destruct()和__clone()
__set()和__get()方法
__call()方法
__sleep()和__wakeup()方法
__toString()方法
__autoload()方法

__call()方法包含两个参数,即方法名和方法参数
方法参数是以数组形式存在的

_set()方法包含两个参数,分别表示变量名称和变量值

__get()方法有一个参数,表示要调用的变量名

使用serialize()函数可以实现序列化对象
unserialize()函数可以重新还原一个被serialize()函数序列化的对象

__sleep()方法可以清除对象并返回一个该对象中所有变量的数组

__wakeup()方法则是恢复在序列化中可能丢失的数据库连接及相关工作

__toString()方法将对象转化为字符串

对象的比较

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>对象的比较</title>
</head>
<body>
<?phpclass SportObject{private $name;function __construct($name){$this -> name = $name;}}$book = new SportObject('book');$cloneBook = clone $book;$referBook = $book;if($cloneBook == $book){echo '两个对象的内容相等<br>';}if($referBook === $book){echo '两个对象的引用地址相等<br>';}
?>
</body>
</html>

对象的比较

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>对象的比较</title>
</head>
<body>
<?phpclass SportObject{private $name;function __construct($name){$this -> name = $name;}}$book = new SportObject('book');$cloneBook = clone $book;$referBook = $book;if($cloneBook == $book){echo '两个对象的内容相等<br>';}if($referBook === $book){echo '两个对象的引用地址相等<br>';}
?>
</body>
</html>

对象类型检测

instanceof操作符可以检测当前对象是属于哪个类

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>对象类型检测</title>
</head>
<body>
<?php
class SportObject{}
class MyBook extends SportObject{private $type;
}
$cBook = new MyBook();
if($cBook instanceof MyBook)echo '对象$cBook属于MyBook类<br>';
if($cBook instanceof SportObject)echo '对象$cBook属于SportObject类<br>';
?>
</body>
</html>

测试结果:

对象$cBook属于MyBook类对象$cBook属于SportObject类

魔术方法:
__set()和__get()方法

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>__set()和__get()方法</title>
</head>
<body>
<?php
class SportObject
{private $type = ' ';public function getType(){return $this -> type;}private function __get($name){if(isset($this ->$name)){echo '变量'.$name.'的值为:'.$this -> $name.'<br>';}else{echo '变量'.$name.'未定义,初始化为0<br>';$this -> $name = 0;}}private function __set($name, $value){if(isset($this -> $name)){$this -> $name = $value; echo '变量'.$name.'赋值为:'.$value.'<br>';}else{$this -> $name = $value;echo '变量'.$name.'被初始化为:'.$value.'<br>';}}
}
$MyComputer = new SportObject();
$MyComputer -> type = 'DIY';
$MyComputer -> type;
$MyComputer -> name;
?>
</body>
</html>

变量type赋值为:DIY
变量type的值为:DIY
变量name未定义,初始化为0
变量name被初始化为:0

__call()方法

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>__call()方法</title>
</head>
<body>
<?php
class SportObject
{public function myDream(){echo '调用的方法存在,直接执行此方法。<p>';}public function __call($method, $parameter){echo '如果方法不存在,则执行__call()方法。<br>';echo '方法名为:'.$method.'<br>';echo '参数有:';var_dump($parameter);}
}
$MyLife = new SportObject();
$MyLife -> myDream();
$MyLife -> mDream('how','what','why');
?>
</body>
</html>

__sleep()和__wakeup()方法

__sleep()方法可以清除对象并返回一个包含对象中所有变量的数组。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>__sleep()和__wakeup()方法</title>
</head>
<body>
<?php
class SportObject{private $type = 'DIY';public function getType(){return $this -> type;}public function __sleep(){echo '使用serialize()函数将对象保存起来,可以存放到文本文件、数据库等地方<br>';return $this;}public function __wakeup(){echo '当需要该数据时,使用unserialize()函数对已序列化的字符串进行操作,将其转换回对象<br>';}
}
$myBook = new SportObject();
$i = serialize($myBook);
echo '序列化后的字符串:'.$i.'<br>';
$reBook = unserialize($i);
echo '还原后的成员变量:'.$reBook -> getType();
?>
</body>
</html>

__toString()方法

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>__toString()方法</title>
</head>
<body>
<?php
class SportObject{private $type = 'DIY';public function __toString(){return $this -> type;}
}
$myComputer = new SportObject();
echo '对象$myComputer的值为:';
echo  $myComputer;
?>
</body>
</html>

__autoload()方法自动实例化需要使用的类

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>__autoload()方法自动实例化需要使用的类</title>
</head>
<body>
<?phpfunction __autoload($class_name){$class_path = $class_name.'.class.php';if(file_exists($class_path)){include_once($class_path);}elseecho '类路径错误。';}$myBook = new SportObject("江山代有人才出 各领风骚数百年");echo $myBook;
?>
</body>
</html><?php
class SportObject{private $cont;public function __construct($cont){$this -> cont = $cont;}public function __toString(){return $this -> cont;}
}
?>

中文字符串的截取类

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>中文字符串的截取类</title>
</head>
<body>
<?php
class MsubStr{function csubstr($str, $start, $len) {                //$str指的是字符串,$start指的是字符串的起始位置,$len指的是长度。$strlen = $start + $len;                          //用$strlen存储字符串的总长度(从字符串的起始位置到字符串的总长度)for($i = 0; $i < $strlen; $i ++) {                    //通过for循环语句,循环读取字符串if (ord ( substr ( $str, $i, 1 ) ) > 0xa0) {  //如果字符串中首个字节的ASCII序数值大于0xa0,则表示为汉字$tmpstr .= substr ( $str, $i, 2 );           //每次取出两位字符赋给变量$tmpstr,即等于一个汉字$i ++;                                        //变量自加1} else {                                         //如果不是汉字,则每次取出一位字符赋给变量$tmpstr$tmpstr .= substr ( $str, $i, 1 );}}return $tmpstr;                                    //输出字符串}
}
$mc=new MsubStr();                                     //类的实例化
?>
<table width="204" height="195" border="0" cellpadding="0" cellspacing="0" background="images/bg.JPG"><tr><td width="25" height="37">&nbsp;</td><td width="157">&nbsp;</td><td width="22">&nbsp;</td></tr><tr><td height="30">&nbsp;</td><td><?php $string="关注!";if(strlen($string)>10){echo substr($string,0,9)."...";}else{echo $string;}?></td><td>&nbsp;</td></tr><tr><td height="30">&nbsp;</td><td><?php $string="关注";if(strlen($string)>10){echo substr($string,0,9)."...";}else{echo $string;}?></td><td>&nbsp;</td></tr><tr><td height="30">&nbsp;</td><td><?php $strs="关注";if(strlen($string)>10){echo $mc ->csubstr($strs, "0" , "9")."...";}else{echo $strs;}?></td><td>&nbsp;</td></tr><tr><td height="30">&nbsp;</td><td><?php $strs="关注";if(strlen($string)>30){echo $mc ->csubstr($strs, "0" , "20")."...";}else{echo $strs;}?></td><td>&nbsp;</td></tr><tr><td height="38">&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
</table>
</body>
</html><?php
class MsubStr{function csubstr($str, $start, $len) { //$str指的是字符串,$start指的是字符串的起始位置,$len指的是长度。$strlen = $start + $len; //用$strlen存储字符串的总长度(从字符串的起始位置到字符串的总长度)for($i = 0; $i < $strlen; $i ++) { //通过for循环语句,循环读取字符串if (ord ( substr ( $str, $i, 1 ) ) > 0xa0) { //如果字符串中首个字节的ASCII序数值大于0xa0,则表示为汉字$tmpstr .= substr ( $str, $i, 2 ); //每次取出两位字符赋给变量$tmpstr,即等于一个汉字$i ++; //变量自加1} else { //如果不是汉字,则每次取出一位字符赋给变量$tmpstr$tmpstr .= substr ( $str, $i, 1 );}}return $tmpstr; //输出字符串
}
}?>
<?php
class changecode{private $str;private $input;private $output;function __construct($input='',$output='gb2312'){$this->input = $input;$this->output = $output;}protected function chgcode($str){if($this->input != ''){$this->str = iconv($input,$output,$str);}else{$this->str = mb_convert_encoding($str,$output);}}function getStr($str){$this->chgcode($str);return $this->str;}function setInput($input){$this->input = $input;}function setOutput($output){$this->output = $output;}function getInput(){return $this->input;}function getOutput(){return $this->output;}
}
?>

结言

好了,欢迎在留言区留言,与大家分享你的经验和心得。

感谢你学习今天的内容,如果你觉得这篇文章对你有帮助的话,也欢迎把它分享给更多的朋友,感谢。

感谢!承蒙关照!您真诚的赞赏是我前进的最大动力!

PHP全栈学习笔记8相关推荐

  1. 字节码学院全栈学习笔记

    今天正式加入字节码学院,努力学习Java全栈,争取在6个月内称为一个了解软件行业的人,本人在这里立铁为证: 搭建vue 组件化开发环境时,需要安装node.js =================== ...

  2. 【Java全栈学习笔记:第一阶段:JavaSE】:Java入门及环境搭建

    Java全栈课程网站: KuangStudy JavaSE课程地址: 狂神说Java 参考书籍:Java大学实用教程(第四版) 目录 Java入门及环境搭建 Java帝国的诞生 Java发展 Java ...

  3. PHP全栈学习笔记29

    前言 这一章主要讲一讲PHP的背景,优势,PHP的环境搭建,书写和调式简单的PHP代码,如何解决简单的PHP错误等. 目录结构 PHP简介 PHP是面向对象,指令式编程,设计者是 拉斯姆斯·勒多夫 出 ...

  4. PHP全栈学习笔记20

    thinkphp概述,thinkphp项目构建流程,thinkphp项目结构,thinkphp配置,thinkphp控制器,thinkphp模型,thinkphp视图,thinkphp的内置模板引擎. ...

  5. python全栈学习笔记(一)网络基础之网络协议篇

    阅读目录 一.操作系统基础 二.网络通信原理 2.1 互联网的本质就是一系列的网络协议 2.2 osi七层协议 2.3 tcp/ip五层模型讲解 2.3.1 物理层 2.3.2 数据链路层 2.3.3 ...

  6. php回调函数求1+2+3+...+100的值_PHP全栈学习笔记6

    php能做什么,它是运行在服务器端的,web网站大部分数据都是存储在服务器上的,PHP就是用来处理这些存储在服务器的数据.跨平台,服务器可以是多种平台上的服务器,脚本语言,免费. wampserver ...

  7. larvare数据库引入php_PHP全栈学习笔记6

    php能做什么,它是运行在服务器端的,web网站大部分数据都是存储在服务器上的,PHP就是用来处理这些存储在服务器的数据.跨平台,服务器可以是多种平台上的服务器,脚本语言,免费. wampserver ...

  8. PHP全栈学习笔记10

    php常量,常量是不能被改变的,由英文字母,下划线,和数字组成,但是数字不能作为首字母出现. bool define ( string $name , mixed $value [, bool $ca ...

  9. php substr 去掉前n位_PHP全栈学习笔记16

    <?php $fileName = "php大师.test.php"; //补充程序,显示文件名(不包括扩展名) $start = strrpos($fileName, &q ...

  10. PHP全栈学习笔记27

    数组概述,类型,声明,遍历,输出,获取数组中最后一个元素,删除重复数组,获取数组中指定元素的键值,排序,将数组中的元素合成字符串. 数组概述,数组是存储,管理和操作一组变量. 数组类型为一维数组,二维 ...

最新文章

  1. python java 爬数据_如何用java爬虫爬取网页上的数据
  2. 夏夏的php开发笔记开写啦
  3. nginx配置文件防盗链
  4. 2021.12.17自制望远镜调焦座材料
  5. 放肆地使用UIBezierPath和CAShapeLayer画各种图形
  6. Kotlin 学习笔记(七)—— Kotlin类与对象之属性与字段
  7. boot spring 解析csv_spring-boot-starter-thymeleaf 避坑指南
  8. C语言自底向上分析方法,算法6-12:自底向上的赫夫曼编码 (C语言代码)
  9. Latex中关于参考文献的一些经验
  10. [渝粤教育] 中国地质大学 中外美术史 复习题 (2)
  11. VS Winform如何设置光标样式
  12. 三星固态硬盘ssd产品线收集
  13. 汇编程序的有符号数与无符号数的加减乘除(8086)
  14. 联想服务器配置 RAID
  15. 易极天成温怀玉:聚焦垂直领域 提供多元化产品和服务|企服三会系列报道
  16. Mac升级自带PHP版本(非Homebrew方式)
  17. Android版股票K线图实现方案
  18. cad lisp 两侧偏移并删除_cad lisp 两侧偏移并删除_CAD中级进阶必备,这10个技巧让你轻松再升一级...
  19. android开发自定义键盘,如何制作Android自定义键盘?
  20. SpringBoot整合Quartz之动态控制任务(暂停,启动,修改执行时间)

热门文章

  1. php返回的信息不刷新,PHP+AJAX无刷新实现返回天气预报数据
  2. ntp服务restrict_linux设置NTP服务器及时间同步
  3. 三因素方差分析_重复测量方差分析的操作教程及结果解读
  4. 平面设计师版式设计细节哪些要重视?
  5. Latex 图标题过长不能跨页显示解决办法,Figure caption does not continue on new page
  6. 局域网语音对讲系统_智慧医疗信息化系统建设(七):医院专业智能化
  7. 多款人工智能抠图软件介绍
  8. mysql联合查询查询语句_mysql多表联合查询语句是什么
  9. python 代码换行_你一定不知道的Python小技巧,提升你Python代码的可读性
  10. Macrorit Partition Expert v5.7.0 硬盘分区管理软件单文件中文版