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
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/>';
image.png
<?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/>';
image.png
<?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();// 只有一个对象创建和销毁
image.png
<?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
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);
image.png面向对象三大特征之封装
image.png
image.png
image.png
image.png
image.png
image.png面向对象编程三大特性之继承
image.png
image.png
- 普通方式
<?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();
image.png
image.png
image.png访问控制修饰符
image.png方法重载和方法重写
image.png
<?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()
image.png
<?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();
image.pngthis关键词
image.png
image.png
image.png
-
实例
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();
image.pngself与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
网友评论