浅谈PHP编程之面向对象
何为对象?
面向对象编程(object-oriented programming) [ˈɑːbdʒekt ˈɔːrientɪd ˈproʊɡræmɪŋ]
对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象。
在现实世界里我们所面对的事情都是对象,如猫、狗、鸟等。
对象的主要三个特性:
- 对象的行为:可以对 对象施加那些操作,开灯,关灯就是行为。
- 对象的形态:当施加那些方法是对象如何响应,颜色,尺寸,外型。
- 对象的表示:对象的表示就相当于身份证,具体区分在相同的行为与状态下有什么不同。
比如 Animal(动物) 是一个抽象类,我们可以具体到一只狗跟一只羊,而狗跟羊就是具体的对象,他们有颜色属性,可以写,可以跑等行为状态。
对象的特点
- 每一个对象都是独一无二的
- 对象是一个特定的事物,他的职能是完成特定功能
- 对象是可以重复使用
对象基本组成
- 对象的组成元素:是对象的数据模型,用于描述对象的数据,又称为对象的属性,或者对象的成员变量.
- 对象的行为: 是对象的行为模型,用于描述对象能够做什么事情,又被称为对象的成员方法.
属性的三种访问权限
- public是公有的类成员,可以在任何地方被访问,可以被类以及子类或者对象都可以访问;
- protected受保护的类成员,可以被其自身以及继承的子类访问,可以被子类继承,但是不能被对象访问,只能通过封装的方式让对象访问;
- private私有的类成员,只能被自身访问.不能被子类继承,也不能被对象访问,只能在自身通过封装让外界访问(例如在类里面定义一个公开方法来调用私有属性);
对象的继承
父类:拥有部分相同的属性和方法
继承的好处:
- 父类里面定义的类成员可以不用在子类中重复定义,节约了编程的时间和代价;
- 同一个父类的子类拥有相同的父类定义的类成员,因此外部代码调用他们的时候可以一视同仁;
- 子类可以修改和调用父类定义的类成员我们称为重写(Overwrite), 一旦子类修改了,就按照子类修改之后的功能执行;
子类
:
- 子类可以通过$this访问父类的属性
- 子类的对象可以直接调用父类的方法和属性
- PHP的单继承特性:类不允许同时继承多个父类(extends后面只能跟一个父类名称)
代码演示
创建如下文件:
<?php
// 成员属性前要有访问修饰符 public private protected
// public 默认的, 关键词定义类内、类外、子类都可见
// protected 关键词定义类内、子类可见,类外不可见
// private 关键词定义类内可见, 子类、类外不可见
class Cat
{
public $weight;
public $species;
public $color;
// protected属性只能由本类或者子类访问
protected $orprotect;
// private属性只能由本类访问
private $caneat;
// 成员方法
public function sleep()
{
echo "$this->species is sleeping <br>";
}
public function hunt()
{
echo "$this->species is hunting<br>";
}
public function caneat()
{
echo "$this->species$this->caneat";
}
public function privateeat()
{
//返回私有属性
return $this->caneat;
}
// 构造函数 构造器 类每实例化一次 构造函数自动被调用
// 类成员之间的互相访问 $this 本对象
// 1.初始化类成员 让类/对象的状态稳定下来
// 2.给对象的属性进行初始化赋值
// 3.给私有或者受保护的成员属性赋值
public function __construct($weight, $species, $color, $orprotect, $caneat)
{
$this->weight = $weight;
$this->species = $species;
$this->color = $color;
$this->orprotect = $orprotect;
$this->caneat = $caneat;
}
}
// new关键字完成类的实例化 得到对象
//$cat1 = new Cat('2kg', '橘猫', '橘色', '不是', '能吃');
//var_dump($cat->caneat);//Cannot access private property Animal::$caneat
// $cat1->caneat();//橘猫能吃
//var_dump($cat1->privateeat());//string '能吃' (length=6)
// object(Cat)[1]
// public 'weight' => string '2kg' (length=3)
// public 'species' => string '橘猫' (length=6)
// public 'color' => string '橘色' (length=6)
// protected 'orprotect' => string '不是' (length=6)
// private 'caneat' => string '能吃' (length=6)
<?php
class Bird
{
public $name;
public $color;
public $taste;
protected $oreat;
private $orprotect;
public function eat1()
{
return $this->oreat;
}
public function ordefend()
{
echo $this->orprotect;
}
public function sparrowinfo()
{
echo $this->name . "的颜色是" . $this->color . "。<br>" . "味道" . $this->taste . "<br>";
}
public function __construct($name, $color, $taste, $oreat, $orprotect)
{
$this->name = $name;
$this->color = $color;
$this->taste = $taste;
$this->oreat = $oreat;
$this->orprotect = $orprotect;
}
}
// $sparrow = new Bird('麻雀', '黑棕色', '美味', '能吃', '不是');
// $sparrow->sparrowinfo();
// echo $sparrow->eat1();
<?php
class Dog
{
public $name;
public $color;
public $taste;
protected $oreat;
private $orprotect;
public function eat1()
{
return $this->oreat;
}
public function ordefend()
{
echo $this->orprotect;
}
public function sparrowinfo()
{
echo $this->name . "的颜色是" . $this->color . "。<br>" . "味道" . $this->taste . "<br>";
}
public function __construct($name, $color, $taste, $oreat, $orprotect)
{
$this->name = $name;
$this->color = $color;
$this->taste = $taste;
$this->oreat = $oreat;
$this->orprotect = $orprotect;
}
}
<?php
class Product{
public $type;
public $color;
protected $weight;
private $price;
public function weight(){
return $this->weight;
}
public function price(){
echo $this->price;
}
public function __construct($type,$color,$weight,$price)
{
$this->type = $type;
$this->color = $color;
$this->weight = $weight;
$this->price = $price;
}
}
<?php
class Sonproduct extends Product
{
}
类的自动加载器
<?php
//类的自动加载器前提是类名称跟类文件名称保持一致(psr-4规范)
spl_autoload_register(function ($classname) {
$file = __DIR__ . DIRECTORY_SEPARATOR . $classname . '.php';
echo $classname . ".php" . "<br>";
if(!(is_file($file) && file_exists($file))){
throw new \Exception("文件不合法或者不存在");
}
require $file;
});
相对于第三方框架、库,我们就是客户端代码文件,我们直接实例化对象
<?php
//相对于第三方框架、库,我们就是客户端代码文件
require 'autoload.php';
//直接实例化对象
$cat1 = new Cat('2kg', '橘猫', '橘色', '不是', '能吃');
$sparrow = new Bird('麻雀', '黑棕色', '美味', '能吃', '不是');
$husky = new Dog('哈士奇', '黑白', '未知', '应该能', '不是');
$computer = new Product('台式电脑','black','5kg','¥6666');
$laptop = new Sonproduct('笔记本','炫酷黑','1.5kg','¥8888');
var_dump($cat1);
var_dump($sparrow);
var_dump($husky);
var_dump($computer);
var_dump($laptop);
echo $laptop->price();
打印结果如下: