类与对象
类是对象的模板,对象是类的实例
一、1.创建类 2.添加类成员 3.访问类成员
demo1
<?php
//OOP (Object Oriented Programming)
//基本步骤
//1.创建类
class Demo1
{
//2.添加类成员
//在变量和函数前添加访问限制符变为类属性和类方法
//类属性和类方法都是类成员 用对象成员访问符 -> 访问
//属性
public $site = 'php.com';
//方法
public function getSite(){
//实例化这个类
$obj = new Demo1;
//返回类属性
return $obj->site.'Welcome~~';
}
}
//3.访问类成员
$d1 = new Demo1;
echo $d1->site.'<br>';
echo $d1->getSite();
二、self当前类 $this当前类的实例
demo2
<?php
//OOP (Object Oriented Programming)
//基本步骤
//1.创建类
class Demo2
{
//2.添加类成员
//在变量和函数前添加访问限制符变为类属性和类方法
//类属性和类方法都是类成员 用对象成员访问符 -> 访问
//属性
public $site = 'php.com';
public $role = '讲师';
//方法 在方法中要进行实例化
public function getSite(){
//实例化这个类
$obj = new self;
//返回类属性
return $obj->site.'Welcome~~';
}
public function getRole(){
//实例化这个类
//$obj = new self;
//添加$this 省略上面的new
//伪变量 实现当前类实例的共享 与当前类实例绑定
//返回类属性
return $this->role.'Hello~~';
}
}
//3.访问类成员
$d1 = new Demo2;
echo $d1->site.'<br>';
echo $d1->getSite().'<br>';
echo $d1->getRole().'<br>';
三、构造方法 __construct()
demo3
<?php
//OOP (Object Oriented Programming)
//基本步骤
//1.创建类
class Demo3
{
//2.添加类成员
public $site;
public $role;
//构造方法 预定义魔术方法
public function __construct($site,$role){
//自动调用,自动完成类的初始化、类实例创建过程中自动完成的
//包括:(php自动完成)
//创建类实例 $obj = new self;
//添加类实例成员 $obj->site =$this->site;
//返回类实例 return $obj;
$this->site = $site;
$this->role = $role;
//输出 getinfo 自动执行
echo $this->getInfo();
}
public function getInfo(){
return '我叫:'.$this->site . $this->role;
}
}
//3.访问类成员
//有构造方法
new Demo3('php中文网','讲师');
四、类成员访问控制
demo4
<?php
//访问控制 /封装
//1.创建类
class Demo4
{
//2.添加类成员
//私有成员pravite 受保护成员protected
public $site;
protected $role;
//不是为了禁止访问,而是防止非法访问,有限定的访问。
//创建访问器 通过public方法 获取用户信息 进行验证
public function getRole(){
//设定访问限制条件
$username = $_GET['username'] ?? '';
if(isset($username) && $username === 'admin'){
return $this->role;
}else{
echo '无法访问';
}
}
//创建访问器 - 访问一个不存在的属性时
//写死了属性值
public function getName(){
return isset($this->name)?$this->name : '不存在的属性';
}
//魔术方法 __get __set __isset 、__unset
public function __get($param){
//重定向所有对未授权不存在属性的访问
$username = $_GET['username'] ?? '';
if(isset($username) && $username === 'admin'){
return isset($this->$param)?$this->$param : '不存在的属性';
}else{
echo '无法访问';
}
}
public function getInfo(){
return '我叫:'.$this->site . $this->role;
}
public function __construct($site,$role){
$this->site = $site;
$this->role = $role;
}
}
//3.访问类成员
$d1 = new Demo4('phpcn','讲师');
//echo $d1->role.'<br>'; // Fatal error: Uncaught Error:Cannot access protected property
//使用访问器
echo $d1->getRole(); //当前是无法访问
//url中传入$_GET的值admin 后可以访问
echo '<hr>';
echo $d1->getName();
echo '<hr>';
echo $d1->name;
五、类的继承
demo5
<?php
//类的继承
//1.创建类
class Demo5
{
//2.添加类成员
//私有成员pravite 受保护成员protected
//不是为了禁止访问,而是防止非法访问,有限定的访问。
public $site;
protected $role;
public function __construct($site,$role){
$this->site = $site;
$this->role = $role;
}
public function getInfo(){
return '我叫:'.$this->site . $this->role;
}
}
//创建子类
class Demo5_1 extends Demo5
{
//继承
//扩展
private $course; //子类新添加属性
public function __construct($site,$role,$course){
//获取父类原有的构造函数中的内容
parent::__construct($site,$role);
//写自己的
$this->course = $course;
}
//重写方法getInfo
public function getInfo(){
//拿过来
return parent::getInfo().',课程:'. $this->course;
}
//代码复用
}
//3.访问类成员
$dd = new Demo5_1('php.cn','JVC','math');
echo $dd->getInfo();
六、新trait技术 php5.4+
demo6
<?php
//trait 代码复用
//公共代码库 类的语法 但不是类 不能实例化
trait Ku
{
public function getInfo(){
return 'trait中:'.$this->site . $this->role;
}
}
//1.创建类
class Demo6
{
//导入trait
use Ku;
//2.添加类成员
//私有成员pravite 受保护成员protected
//不是为了禁止访问,而是防止非法访问,有限定的访问。
public $site;
protected $role;
public function __construct($site,$role){
$this->site = $site;
$this->role = $role;
}
// public function getInfo(){
// return '父类中:'.$this->site . $this->role;
// }
}
//创建子类
class Demo6_1 extends Demo6
{
//继承
//扩展
private $course; //子类新添加属性
public function __construct($site,$role,$course){
//获取父类原有的构造函数中的内容
parent::__construct($site,$role);
//写自己的
$this->course = $course;
}
//重写方法getInfo
public function getInfo(){
//拿过来
return parent::getInfo().',课程:'. $this->course;
}
}
//3.访问类成员
//正常
$d1 = new Demo6('php.cn','JVC');
echo $d1->getInfo();
echo '<br>';
$dd = new Demo6_1('php','java','go');
echo $dd->getInfo();
七、接口
demo7
<?php
//类的模板是接口
interface iDemo
{
//接口常量
//接口方法
public function getInfo();
public function hello();
}
//1.创建类
class Demo7 implements iDemo
{
//工作类
public $site;
protected $role;
public function __construct($site,$role){
$this->site = $site;
$this->role = $role;
}
public function getInfo(){
return $this->site . $this->role;
}
public function hello(){
return 'hello';
}
}
//3.访问类成员
$d1 = new Demo7('php','java');
echo $d1->getInfo();
echo '<br>';
echo $d1->hello();
八、抽象类
demo8
<?php
//抽象类 不能实例化 只能做父类
abstract class Abs{
abstract public function getInfo();
public function hello(){
return 'hello';
}
}
//1.创建类
class Demo8 extends Abs
{
//2.添加类成员
public $site;
protected $role;
public function __construct($site,$role){
$this->site = $site;
$this->role = $role;
}
//实现抽象类中的方法
public function getInfo(){
return $this->site . $this->role;
}
}
//3.访问类成员
$d = new Demo8('php','c');
echo $d->getInfo();
echo '<br>';
echo $d->hello();
手写:
[创建类,添加类成员,访问类成员.mp3] ×10
总结:一些普通的问题经过老师不同的角度讲解又会有不一样的认知,更加深记忆。弥补自己之前一些未理解的内容。查缺补漏有收获。目前对类的使用还是太少,我认识它,它不认识我。