一、软件工程学
分为结构化方法(按软件周期分为三个阶段 分析、设计、编程)和面向对象。
二、面向对象
OOP(Object-Oriented Programming,面向对象的编程)。
3个目标
重用性、灵活性、扩展性
特点
封装、继承、多态
面向对象的三个主要特征:
- 对象的行为
- 对象的状态
- 对象的标识
三、最简单的类
<?php
/*
* 类的声明
* */
class Person
{
public $age;
public function say($word)
{
echo "she say$word";
}
public function info()
{
$this->say("Hi");
return $this->age;
}
}
$xiaoHong = new Person();
$xiaoHong->age = 22;
$age = $xiaoHong->info();
echo "<br/>";
echo $age;
?>
四、构造方法和析构方法
<?php
/*
* 本 demo 为了测试构造方法和析构方法
* */
class Person
{
public function __construct($name, $age)
{
// 当这个类 new 的时候自动执行
echo 'hello' . $name;
echo "<hr/>";
$this->name = $name;
$this->age = $age;
}
public function data()
{
return $this->age;
}
public function __destruct()
{
// 可以进行资源的释放操作 数据库关闭
// 对象被销毁的时候执行 没有代码再去运行了
echo "bye bye {$this->name}";
echo "<br/>";
}
}
new Person("first", 30);
new Person("second", 30);
?>
PS:给我的感觉就是生命周期
五、封装
class Person
{
public $name;
private $age;
protected $money;
public function __construct($name, $age, $money)
{
$this->name = $name;
$this->age = $age;
$this->money = $money;
}
public function getName()
{
echo $this->name;
}
private function getAge()
{
return $this->age;
}
protected function getMoney()
{
return $this->money;
}
public function card()
{
echo "name:" . $this->getName() . ">>>>>>>>>>>>>>" . "age:" . $this->getAge() . ">>>>>>>>>>>>>>" . "money:" . $this->getMoney();
return "haha";
}
public function __set($name, $value)
{
if ($name == "age" && $value == "50") {
$this->age = 40;
}
}
public function __get($name)
{
if ($name=="money"){
return "我不告诉你~";
}
}
public function __isset($name)
{
if ($name=="money"){
return "钱不和你说";
}
}
public function __unset($name)
{
if ($name=="money"){
unset($this->money);
}
}
}
$xiaoHei = new Person("first", 30, 2000);
$xiaoHei->age=50;
echo $xiaoHei->card();
echo $xiaoHei->money;
var_dump(isset($xiaoHei->money)); // 要是类里面不写 __isset方法 为 false; 否则为true
unset($xiaoHei->money);
echo $xiaoHei->card();
PS:魔术方法只对私有变量和受保护的变量有效
六、继承和重写
<?php
class Person
{
public $name;
private $age; // 无法继承
protected $money; // 可以继承但是外部不可读
function __construct($name, $age, $money)
{
$this->name = $name;
$this->age = $age;
$this->money = $money;
}
public function info($pp)
{
echo "name:" . $this->name . "<br/>";
echo "age:" . $this->age . "<br/>";
echo "money:" . $this->money . "<br/>";
}
}
class Yellow extends Person
{
function __construct($name, $age, $money)
{
parent::__construct($name, $age, $money);
}
public function info($pp) // 在重写的时候,父类中方法的参数必须和子类一致,就是要兼容的意思。否则会报错。
{
parent::info("aa");
echo $pp;
}
}
$s = new Yellow("xiaobai", 23, 20000);
$s->info(123);
/**
name:xiaobai
age:23
money:20000
123
* */
?>
七、抽象类
- 含有抽象方法的类必须是抽象类
- 抽象类不一定非得有抽象方法
- 抽象类可以存在普通方法
- 抽象类一定不能被实例化,必须有一个子类去继承,并且把抽象类的方法都实现了
abstract class Person
{
// 抽象类没有实体
public abstract function eat();
}
class Man extends Person{
public function eat(){
echo "eat";
}
}
$man = new Man();
$man->eat();
八、接口
- 接口声明的关键字是 interface
- 接口可以声明常量也可以抽象方法
- 接口中的方法都是抽象法法 不用 abstract 去人肉的定义
- 接口不能被实例化 需要一个类去实现它
- 一个类不能继承多个类 一个类可以实现多个接口
interface Person
{
const NAME = "xiaoBai";
public function run();
public function eat();
}
interface Study
{
public function study();
}
class Student implements Person, Study
{
const data = 3.14;
public function run()
{
echo "run";
}
public function eat()
{
echo "eat";
}
public function study()
{
echo "study";
}
public static function test()
{
echo self::data;
}
}
$xb = new Student();
$xb->study();
echo $xb::NAME; // xiaoBai
echo $xb->test(); // 3.14
echo Student::data; //3.14