如何在线学习PHP开发(五)面向对象
2020-04-03 本文已影响0人
简简天天
面向对象编程的基本概念



类和对象的关系

-
类的概念
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
class Person{
public function __construct()
{
echo '有新对象创建了<br/>';
}
public function __destruct()
{
echo '对象被销毁了<br/>';
}
}
$person = new Person();
echo xdebug_debug_zval('person');
//unset($person); // 显示销毁$person指向的Person对象
$person = 10; // 赋值也可以销魂Person对象
echo xdebug_debug_zval('person');
echo '<hr/>';

<?php
class Person{
public function __construct()
{
echo '有新对象创建了<br/>';
}
public function __destruct()
{
echo '对象被销毁了<br/>';
}
}
$p1 = new Person();
echo xdebug_debug_zval('p1');
$p2 = $p1;
echo xdebug_debug_zval('p1');
unset($p1);
echo xdebug_debug_zval('p2');
echo '<hr/>';

<?php
class Person{
public function __construct()
{
echo '有新对象创建了<br/>';
}
public function __destruct()
{
echo '有对象被销毁了<br/>';
}
}
/**
* 有多少个对象创建就有多少个对象销毁
*/
$p1 = new Person();
$p2 = new Person();
$p3 = new Person();
$p1=$p2=$p3=new Person();// 只有一个对象创建和销毁

<?php
class Person{
public function __construct()
{
echo '有新对象创建了<br/>';
}
public function __destruct()
{
echo '有对象被销毁了<br/>';
}
}
$p1[] = new Person();
echo xdebug_debug_zval('p1');
$p1[] = &$p1;
echo xdebug_debug_zval('p1');
unset($p);
echo xdebug_debug_zval('p1');
echo '<hr/>';

面向对象和面向过程实例的对比
-
面向过程的
image.png
image.png
image.png
- 面向对象的
<?php
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().'<br/>');
}
$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);
面向对象三大特征之封装






面向对象编程三大特性之继承



- 普通方式
<?php
// 普通方式描述三个类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();
- 继承方式
<?php
// 继承
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();


访问控制修饰符

方法重载和方法重写


<?php
// PHP模拟JAVA的方法重载
class Person
{
public function test()
{
echo 'Person->test()<br/>';
echo '参数个数:'.func_num_args();//获取方法调用时的参数个数
print_r(func_get_args());//获取方法调用时的参数值
$args = func_num_args();
$args_arr = func_get_args();
switch($args){
case 0:
echo '这是没有参数调用<br/>';
break;
case 1:
echo '这是有1个参数的调用<br/>';
break;
case 2:
echo '这是有两个参数的调用<br/>';
break;
default:
echo '未定义的参数调用方式<br/>';
break;
}
}
/**
* 在JAVA中实现方法重载
* @param $a
* @param $b
*/
/* public function test($a,$b){
}*/
}
$a = new Person();
$a->test(); // Person->test()
$a->test('我叫a');// Person->test()

<?php
// PHP模拟JAVA的方法重载
class Person
{
public $name;
public function __construct($name='a')
{
$this->name=$name;
}
public function test()
{
echo '我是父类的test方法<br/>';
}
}
class Stu extends Person{
public $age;
function __construct($name = 'a', $age = 22)
{
$this->name = $name;
$this->age = $age;
}
public function test()
{
echo '我是Stu里的test方法<br/>';
}
}
$b = new Stu('b',22);
echo $b->test();
this关键词




-
实例
image.png
<?php
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

-
self关键词及用法
image.png
<?php
class Person{
public $name = 'A';
public static $age = 22; //static修饰的是静态属性
public $self = null;
public function intro(){
echo 'My name is'.$this->name.'<br/>';
// 静态属性必须使用类名调用
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
