一、介绍
面向对象编程(OOP),是编程思想,不是技术。学习面向对象编程主要有两点:
1.基本语法 2.编程思想
首先我们需要了解核心概念:类与对象。类是生成对象的模版,对象是类的一个实例。如:人类和人,一个人(个体)是人类(整体),但是人类包含了全部的人;类与对象的关系就是整体类别与个体之间的关系。
二、类的创建(类的声明与内部属性和方法的定义)
<?php
// 每个类的定义都以关键字 class 开头,后面跟着类名,后面跟着一对花括号,里面包含有类的属性与方法的定义。
class Student{
// 属性与方法
// 属性的声明必须以访问控制符开头
public $name = 'Tom'; // 公共属性,外部可以访问
// 属性访问控制符:public/private和protected
private $age = 14; // 私有属性,只允许类中的访问调用
protected $sex = 'male'; // 受保护的,仅允许本类或子类访问
// 属性的类型可以是标量(整数、浮点、字符串、布尔值),符合类型(数组、对象)
// 方法也必须以访问控制符开头
public function getName(){
// $this是伪变量,总是指向当前对象
return $this->name;
}
public function getAge(){
return $this->age;
}
}
// 创建对象的过程,就是类的实例化
$stu = new Student();
echo $stu->getName().'<br>'; // 用对象访问运算符来访问属性方法
// echo $stu->age; // private定义的属性不能在外部访问
echo $stu->getAge();
// Tom
// 14
// 对象是一个引用变量,对象的复制并没有创建新的对象,而是创建一个当前对象的引用
$stu2 = $stu;
echo $stu->name; // Tom
echo '<br>';
$stu2->name = 'Peter';
echo $stu->name; // Peter
// 由于是对象的引用,$stu2和$stu操作的都是同一个对象,所以$stu->name的值变成了 Peter
?>
三、对象的创建(6种方式)
<?php
class Student
{
public $name = 'Peter';
public function getName(){
return $this->name;
}
public function createStu(){
return new self();
}
public function getStatic(){
return new static();
}
}
// 1. 使用new 类名()来创建一个对象
$stu = new Student();// 当不需要传入参数的时候,可以省去括号
echo $stu->name; // Peter
echo '<br>';
echo $stu->getName(); // Peter
echo '<hr>';
// 2. 将类名,以字符串的方式放在变量中
$className = 'Student';
$stu2 = new $className();
echo $stu2->name; // Peter
echo '<hr>';
// 3. 用对象来创建对象,它创建的是一个新对象
$stu3 = new $stu(); // $stu3 与 $stu是不同的
echo get_class($stu3); //Student
echo '<br>';
echo $stu3->name; // Peter
echo '<hr>';
// 4. 用new self(),创建当前类的实例,创建的是新对象
$stu40 = new Student();
$stu4 = $stu40->createStu();
echo $stu40->name; // Peter
$stu40->name = 'Charry';
echo $stu40->name; // Charry
echo $stu4->name; // Peter
echo '<hr>';
// 5. 用new parent(),创建父类的实例,创建的是新对象
// Student2 继承 Student
class Student2 extends Student
{
public $name = 'Peter Parker';
public function createParent(){
return new parent();
}
}
$stu50 = new Student2();
$stu5 = $stu50->createParent();
echo $stu50->name; // Peter Parker
echo '<br>';
$stu50->name = 'Charry';
echo $stu50->getName(); // Charry
echo '<br>';
echo $stu5->name; // Peter
echo '<hr>';
// 6. 基于当前调用的类来创建:new static
$stu6 = (new Student())->getStatic();
$stu7 = (new Student())->createStu();
echo get_class($stu6);//Student
echo get_class($stu7);//Student
echo '<hr>';
$stu8 = (new Student2())->getStatic();
$stu9 = (new Student2())->createStu();
echo get_class($stu8);//Student2
// new static() 创建的对象,直接与调用者绑定,静态延迟绑定
echo get_class($stu9);//Student
?>