PHP学习——19 PHP面向对象(介绍与创建)

版权声明:本文为博主原创文章,仅供学习交流,未经博主允许不得转载。 https://blog.csdn.net/zjy_android_blog/article/details/83244067

一、介绍

面向对象编程(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
?>

猜你喜欢

转载自blog.csdn.net/zjy_android_blog/article/details/83244067