1. 手抄课堂笔记: 1203.md (必做)
2. 编程代码,抄写课堂案例,也可以自定义(选做)
demo1.php
# OOP基本操作
# 1. 创建类
class Demo1{
# 2. 添加类成员
# 在类中的变量和函数,和程序中的变量与函数有区别,添加了访问限制
# 变量=>属性,函数=>方法,访问限制符,成员
public $site = 'google';
public function getSite(){
# 类实例化,
$obj = new Demo1;
# 返回类属性
return $obj->site.' welcome';
}
}
# 3. 访问类成员
$obj = new Demo1;
#访问属性:对象成员访问符:->
echo $obj->site. '<br>';
echo $obj->getSite();
demo2.php
# 1. 创建类
class Demo2{
# 2. 添加类成员
public $site = 'google';
public $role = 'visitor';
public function getSite(){
# 类实例化, self是类的引用,始终与当前的类名绑定
//$obj = new self; #等同 new Demo2
# 返回类属性
//return $obj->site.' welcome';
return $this->site;
}
public function getRole(){
//$obj = new self;
# $this是当前类的实例引用,始终与类的实例绑定
//return $obj->site;
return $this->role;
}
}
# 3. 访问类成员
//$obj = new Demo2;
$obj = new Demo2(); # 函数调用
#访问属性:对象成员访问符:->
echo $obj->getSite() .'<br>';
echo $obj->getRole() .'<br>';
demo3.php
class Demo3{
public $site;
public $role;
public function getInfo(){
return '我是' .$this->site. $this->role;
}
# 构造函数: <1>类实例的初始化,<2>自动完成在类实例创建过程中的操作
public function __construct( $site, $role ){
# 1 初始化类成员
$this->site = $site;
$this->role = $role;
# 2 创建类实例
//$obj = new self;
# 3 添加类实例成员
//$obj->site = $this->site;
//$obj->role = $this->role;
echo $this->getInfo();
# 4 返回类实例
//return $obj;
# 用//注释的是系统内部执行的
}
}
new Demo3( '谷歌' ,'游客');
demo4.php
# 魔术方法:
# __get($n): 当获取未定义不可见属性时触发,需要一个参数
# __set($n, $val) :当给未定义不可见属性赋值时触发,需要两个参数
# __isset($n): 当检测未定义不可见属性时触发
# __unset($n): 当注销未定义不可见属性时触发
class Demo4{
public $site;
private $role;
# 构造函数
public function __construct( $site, $role ){
$this->site = $site;
$this->role = $role;
}
public function __get( $n ){
# 仅允许带name参数的访问
if( isset( $_GET['name'] ) ){
return isset( $this->$n ) ? $n.' : '.$this->$n : '属性未定义';
}
else{
return '无权访问';
}
}
public function __set($n, $val){
# 针对role,仅允许带name参数,值为admin的设置
if( isset( $_GET['name']) ){
if( $n == 'role'){
if( $_GET['name']==='admin' ){
$this->$n = $val;
echo $n.' 属性设置成功';
}
else{
echo $n.' 属性设置失败';
}
}
else{
$this->$n = $val;
echo $n.' 属性设置成功';
}
}
else{
echo '无权设置 '.$n.' 属性';
}
}
public function __isset( $n ){
# 仅允许带name参数的访问
if( isset( $_GET['name'] ) ){
if( isset($this->$n) ){
echo '存在 '.$n.' 属性';
}
else{
echo '没有 '.$n.' 属性';
}
}
else{
echo '无权检测 '.$n.' 属性';
}
}
public function __unset($n ){
# 仅允许带name参数的删除
if(isset($_GET['name']) ) {
if( $n != 'role' && $n != 'site' ){
unset( $this->$n );
echo $n . ' 属性删除成功';
}
else{
echo '任何人都不能删除 '.$n.' 属性哦';
}
} else {
echo '无权删除 ' . $n . ' 属性';
}
}
}
$obj = new Demo4( '爱奇艺' ,'会员');
# http://php.io:8080/1203/demo4.php?name=xxx 属性未定义
# http://php.io:8080/1203/demo4.php 无权访问
echo $obj->role,'<hr>';
# 属性不可见,设置值时,触发__set()
$obj->role = '白银';
echo '<br>';
# 属性不可见,输出值时,触发__get()
echo $obj->role,'<br>';
# 属性不可见,检测时,触发__isset()
isset($obj->role);
echo '<br>';
# 属性不可见,删除时,触发__unset()
unset($obj->role);
echo '<br>';
isset($obj->role);
echo '<hr>';
# 属性未定义,输出属性时,触发__isset() 和 __get()
echo $obj->age,'<br>';
# 属性未定义,设置值时,触发__set()
$obj->age = '66';
echo '<br>';
# 属性已定义,获取时,不会触发__get()
echo $obj->age,'<br>';
# 与上同理
isset($obj->age);
echo '<br>';
# 与上同理
unset($obj->age);
echo '<br>';
# 属性unset后未定义,检测属性时,触发__isset()
isset($obj->age);
echo '<hr>';
demo5.php
class Demo5{
public $site;
protected $role;
public function getInfo(){
return '我是' .$this->site. '正儿八经的'.$this->role;
}
# 构造函数
public function __construct( $site, $role ){
$this->site = $site;
$this->role = $role;
}
}
class Demo5_1 extends Demo5{
private $level;
public function __construct( $site, $role, $level ){
parent::__construct( $site, $role );
$this->level = $level;
}
# 重写
public function getInfo(){
return parent::getInfo().',等级' .$this->level;
}
}
$sub = new Demo5_1( '优酷' ,'黄金会员','v7');
echo $sub->getInfo();
demo6.php
# trait 代码复用方式,用了扩展当前类功能
# trait 当作一个公共方法库
# trait 使用类的定义的语法,但不是类
# trait 还可用在类的继承上下文环境里
trait Test{
public function getInfo(){
return '我是' .$this->site. '正儿八经的'.$this->role;
}
}
# 宿主类
class Demo6{
use Test;
public $site;
protected $role;
# 构造函数
public function __construct( $site, $role ){
$this->site = $site;
$this->role = $role;
}
}
class Demo6_1 extends Demo6{
private $level;
public function __construct( $site, $role, $level ){
parent::__construct( $site, $role );
$this->level = $level;
}
# 重写
public function getInfo(){
return parent::getInfo().',等级' .$this->level;
}
}
$sub = new Demo6( '优酷' ,'黄金会员');
echo $sub->getInfo(), '<hr>';
$sub = new Demo6_1( '优酷' ,'黄金会员','v7');
echo $sub->getInfo(), '<hr>';
# 优先级:当前类的同名方法 > trait类的同名方法 > 父类的同名方法
demo7.php
# 面向接口编程,是最重要的编程思想之一,许多高级应用严重依赖它
# 接口是一种约定,定义了实现它的类中必须实现的方法
# 接口中没有方法的具体实现, 所以不能实例化
# 定义方法类中的工作原型
interface Idemo{
public function getInfo();
public function hello();
}
# 工作类
class Demo7 implements Idemo{
public $site;
protected $role;
public function getInfo(){
return '我是' .$this->site. '最靓的'.$this->role;
}
public function hello(){
return '左边画个龙,右边画一道彩虹';
}
# 构造函数
public function __construct( $site, $role ){
$this->site = $site;
$this->role = $role;
}
}
$obj = new Demo7( '舞台','仔' );
echo $obj->getInfo(),'<br>';
echo $obj->hello();
demo8.php
# 抽象类 abstract
# 抽象类:有抽象方法,也有普通方法
# 接口:只有抽象方法
abstract class Ademo{
abstract public function getInfo();
public function hello(){
return '蹦迪路上怎能有障碍';
}
}
class Demo8 extends Ademo{
public $site;
protected $role;
public function getInfo(){
return 'come on ! '. $this->site. ',欢迎'.$this->role;
}
# 构造函数
public function __construct( $site, $role ){
$this->site = $site;
$this->role = $role;
}
}
$obj = new Demo8( 'Disco.club','舞池里的007' );
echo $obj->getInfo(),'<br>';
echo $obj->hello();