面向对象编程的基本概念
image.png
image.png
image.png
类和对象的关系
image.png
类的概念
image.png
对象的概念
image.png
类和对象的关系
image.png
类的声明和对象的创建
image.png
如何声明一个类
image.png
如何创建一个对象
image.png
image.png
类的属性和方法
image.png
属性的定义
image.png
方法的定义
image.png
属性和方法的访问
image.png
image.png
image.png
image.png
image.png
image.png
对象的比较
image.png
不使用命名空间
image.png
使用命名空间
image.png
image.png
image.png
构造方法
image.png
image.png
构造方法的声明
image.png
image.png
image.png
image.png
析构函数与PHP的垃圾回收机制
image.png
析构函数
image.png
垃圾回收
image.png
class Person{
public function __construct()
{
echo '有新对象创建了
';
}
public function __destruct()
{
echo '对象被销毁了
';
}
}
$person = new Person();
echo xdebug_debug_zval('person');
//unset($person); // 显示销毁$person指向的Person对象
$person = 10; // 赋值也可以销魂Person对象
echo xdebug_debug_zval('person');
echo '
';
image.png
class Person{
public function __construct()
{
echo '有新对象创建了
';
}
public function __destruct()
{
echo '对象被销毁了
';
}
}
$p1 = new Person();
echo xdebug_debug_zval('p1');
$p2 = $p1;
echo xdebug_debug_zval('p1');
unset($p1);
echo xdebug_debug_zval('p2');
echo '
';
image.png
class Person{
public function __construct()
{
echo '有新对象创建了
';
}
public function __destruct()
{
echo '有对象被销毁了
';
}
}
/**
* 有多少个对象创建就有多少个对象销毁
*/
$p1 = new Person();
$p2 = new Person();
$p3 = new Person();
$p1=$p2=$p3=new Person();// 只有一个对象创建和销毁
image.png
class Person{
public function __construct()
{
echo '有新对象创建了
';
}
public function __destruct()
{
echo '有对象被销毁了
';
}
}
$p1[] = new Person();
echo xdebug_debug_zval('p1');
$p1[] = &$p1;
echo xdebug_debug_zval('p1');
unset($p);
echo xdebug_debug_zval('p1');
echo '
';
image.png
面向对象和面向过程实例的对比
面向过程的
image.png
image.png
image.png
面向对象的
class User{
public $userInfo = array();//用户信息
public $userName = '';//可查询的用户名
/**
* 构造方法
* User constructor.
* @param $userName string 用户名
*/
public function __construct($userName)
{
$this->userName = $userName;
}
/**
* 获取用户信息
* @return array 用户信息
*/
public function getUserInfo(){
// 1.连接数据库,mysqli_connect 返回的是一个数据库连接句柄,如果连接失败,返回false并输出相关错误信息
$link = mysqli_connect('localhost','root','123456', 'test');
if(!$link){
die('数据库连接失败,错误代码:'.mysqli_connect_errno().'错误信息:'.mysqli_connect_error().'
');
}
$sql = "select * from test where name='{$this->userName}'";
$result = mysqli_query($link, $sql);
$this->userInfo = mysqli_fetch_array($result);
return $this->userInfo;
}
}
$user= new User('lxy');
$userInfo = $user->getUserInfo();
print_r($userInfo);
面向对象三大特征之封装
image.png
image.png
image.png
image.png
image.png
image.png
面向对象编程三大特性之继承
image.png
image.png
image.png
普通方式
// 普通方式描述三个类Animal、Dog、Cat
class Animal
{
public $name = 'Animal';
public function shout()
{
echo '动物叫';
}
}
class Dog{
public $name = 'Dog';
public $owner = 'D';
public function shout(){
echo '狗叫';
}
public function swim(){
echo '狗游泳';
}
}
class Cat{
public $name = 'Cat';
public $owner = 'C';
public function shout(){
echo '猫叫';
}
public function eatFish(){
echo '猫吃鱼';
}
}
$dog = new Dog();
echo $dog->name;
echo $dog->shout();
继承方式
// 继承
class Animal
{
public $name = 'Animal';
public function shout()
{
echo '动物叫';
}
}
class Dog extends Animal {
public $owner = 'D';
// 重写
public function shout()
{
echo '狗叫';
}
public function swim(){
echo '狗游泳';
}
}
$dog = new Dog();
echo $dog->name;
echo $dog->owner;
echo $dog->shout();
echo $dog->swim();
image.png
image.png
访问控制修饰符
image.png
方法重载和方法重写
image.png
image.png
// PHP模拟JAVA的方法重载
class Person
{
public function test()
{
echo 'Person->test()
';
echo '参数个数:'.func_num_args();//获取方法调用时的参数个数
print_r(func_get_args());//获取方法调用时的参数值
$args = func_num_args();
$args_arr = func_get_args();
switch($args){
case 0:
echo '这是没有参数调用
';
break;
case 1:
echo '这是有1个参数的调用
';
break;
case 2:
echo '这是有两个参数的调用
';
break;
default:
echo '未定义的参数调用方式
';
break;
}
}
/**
* 在JAVA中实现方法重载
* @param $a
* @param $b
*/
/* public function test($a,$b){
}*/
}
$a = new Person();
$a->test(); // Person->test()
$a->test('我叫a');// Person->test()
image.png
// PHP模拟JAVA的方法重载
class Person
{
public $name;
public function __construct($name='a')
{
$this->name=$name;
}
public function test()
{
echo '我是父类的test方法
';
}
}
class Stu extends Person{
public $age;
function __construct($name = 'a', $age = 22)
{
$this->name = $name;
$this->age = $age;
}
public function test()
{
echo '我是Stu里的test方法
';
}
}
$b = new Stu('b',22);
echo $b->test();
this关键词
image.png
image.png
image.png
image.png
实例
image.png
class Person
{
private $work_year = 0; // 工龄
private $salary; // 工资
/**
* 获取工龄
* @return int
*/
public function getWorkYear()
{
return $this->work_year;
}
public function setWorkerYear($year = 0)
{
$this->work_year = $year;
}
/**
* 获取工资
* @return int
*/
public function getSalary()
{
// 通过工资工龄的对应关系计算工资
$payoff = new PayOff();
// 通过发工资类的一个方法计算工资
// 谁调用获取工资的方法,$this指向谁
$this->salary = $payoff->pay($this);
return $this->salary;
}
}
/**
* 工资和工龄对应关系类
* Class PayOff
*/
class PayOff {
public function pay(Person $person){
$salary = 0;
$year = $person->getWorkYear();
if($year<=1){
$salary=1000;
}elseif($year>1 && $year<3){
$salary = 2000;
}elseif($year>=3){
$salary = 3000;
}
return $salary;
}
}
$a = new Person();
echo '工龄:'.$a->getWorkYear().'工资是:'.$a->getSalary();
$a->setWorkerYear(10);
echo '工龄:'.$a->getWorkYear().'工资是:'.$a->getSalary();
self与parent
image.png
self关键词及用法
image.png
class Person{
public $name = 'A';
public static $age = 22; //static修饰的是静态属性
public $self = null;
public function intro(){
echo 'My name is'.$this->name.'
';
// 静态属性必须使用类名调用
echo 'My age is'. self::$age;
echo 'My age is'.self::getAge();
$this->self = new self(); // 相当于new Person()
}
public static function getAge(){
return self::$age;
}
}
$a = new Person();
$a->intro();
parent关键词及用法
image.png
image.png
image.png
image.png
image.png
image.png