Correcting teacher:PHPz
Correction status:qualified
Teacher's comments:
<?php
// 类与对象
namespace _0815;
use _0815\Query as _0815Query;
/**
* 1. 属性重载: __get(),__set()
* 2. 方法重载:__call($name,$args), __callStatic($name,$args)
*/
// 封装, 重载, 继承
class User {
// 私有 封装
private int $salary =10000;
// 私有 封装
private int $age=100;
// 查询接口
public function getAge(){
return $this ->age;
}
}
// 实例化
$user = new User ();
echo $user ->getAge() ;
echo '<hr>';
//--------------------------------------------
class User2 {
// 私有 封装
private int $salary =10000;
// 私有 封装
private int $age=100;
// 查询接口 属性拦截器 魔术方法 属性重载
// 注意两个下划线
public function __get($name){
return $this ->$name;
}
}
// 实例化
$user2 = new User2 ();
echo $user2 ->age ;
echo '<hr>';
//--------------------------------------------
class User3 {
// private 私有 封装 常用
// $data 数据容器 用数组表示
private array $data = [
'age' => 20,
];
// 查询接口 属性拦截器 魔术方法 属性重载
// 注意两个下划线
// 商业代码
public function __get($name){
if (array_key_exists($name,$this ->data) ){
return $this -> data[$name];
}else {
return "$name 不存在" ;
}
}
}
// 实例化
$user3 = new User3 ();
echo $user3 ->age ;
echo '<hr>';
echo $user3 ->dog ;
echo '<hr>';
//--------------------------------------------
class User4 {
// private 私有 封装 常用
// $data 数据容器 用数组表示
private array $data = [
'age' => 20,
];
// 查询接口 属性拦截器 魔术方法 属性重载
// 注意两个下划线
// 商业代码
public function __get($name){
// 借助中间变量 result 实现单 return 返回
$result =null ;
if (array_key_exists($name,$this ->data) ){
$result = $this -> data[$name];
}else {
$result = "$name 不存在" ;
}
return $result;
}
}
// 实例化
$user4 = new User4 ();
echo $user4 ->age ;
echo '<hr>';
echo $user4 ->dog ;
echo '<hr>';
//--------------------------------------------
class User5 {
// private 私有 封装 常用
// $data 数据容器 用数组表示
private array $data = [
'age' => 20,
];
// 查询接口 属性拦截器 魔术方法 属性重载
// 注意两个下划线
// 商业代码
public function __get($name){
// return array_key_exists($name ,$this ->data)? $this ->data[$name]:"$name 属性不存在";
// 判断属性是否存在
$condition = array_key_exists($name ,$this ->data);
return $condition ? $this ->data[$name]:"$name 属性不存在";
}
// __set($name,$value): 见 812代码
}
// 实例化
$user5 = new User5 ();
echo $user5 ->age ;
echo '<hr>';
echo $user5 ->dog ;
echo '<hr>';
//--------------------------------------------
class User6 {
// private 私有 封装 常用
// $data 数据容器 用数组表示
private array $data = [
'age' => 20,
];
// 查询接口 属性拦截器 魔术方法 属性重载
// 注意两个下划线
// 商业代码
public function __get($name){
// return array_key_exists($name ,$this ->data)? $this ->data[$name]:"$name 属性不存在";
$condition = array_key_exists($name ,$this ->data);
return $condition ? $this ->data[$name]:"$name 属性不存在";
}
// __set($name,$value): 见 812代码
// 可以自动拦截对于方法的非法访问
// 第一个参数是方法名称
// 第二个参数是以数组表示的参数列表
public function __call($name, $arguments)
{
// return '方法不存在';
printf('方法名:%s<br>参数列表:<pre>%s</pre><br>',$name ,print_r($arguments,true));
}
public static function __callStatic($name, $arguments)
{
// 第一个参数是方法名称
// 第二个参数是以数组表示的参数列表
printf('方法名: %s<br>参数列表: <pre>%s</pre>', $name, print_r($arguments, true));
}
}
// 实例化
$user6= new User6 ();
echo $user6->age ;
echo '<hr>';
echo $user6 -> cat;
echo '<hr>';
// echo $user6 -> hello();
// echo '<hr>';
// 非静态方法 类的实例访问
echo $user6 -> hello('小狗','123@qq.om');
echo '<hr>';
// 静态方法 类访问 ::方法名
User6 ::word (100,200);
echo '<hr>';
// tinkphp 查询构造器 数据库操作
// Query 固定语法
class Query {
// 当这个查询类 实例化时,自动连接数据库 实例化的时候 自动连接数据库
// public function __construct()
// {
// self::connect();
// }
public function table(){
return $this;
}
public function where(){
return $this;
}
public function find(){
echo '完成';
}
}
// 查询入口类
class Db{
public static function __callStatic($name, $arguments)
{
// echo $name ,',', $arguments [0];
// 所有查询操作再次完成, 单入口查询,惰性查询
return call_user_func_array( [ new Query,$name],$arguments );
}
}
Db ::table( 'think_user' )->where('id', 1)->find();
// 表名
// Db::table('think_user')->where('id', 1)->find();
<?php
namespace _0815;
use _0815\Demo1 as _0815Demo1;
/**
* 类的扩展/抽象/最终
* 1. 可继承成员: protected
* 2. extends: 类成员的来源
* 3. parent: 父类引用
*/
class Person
{
// 属性
// 默认 public 公告成员,当前类 类外部
// public $email = '123@qq.com';
// private 私有成员 类外部不可见
private int $id =18;
// protected 受保护的
protected string $name;
// public > protected > private
// 类中,类外,子类: public
// 类中,子类: protected
// 类中: private
// 方法
public function __construct($name)
{
$this ->name =$name;
}
// 自定义方法
protected function getInfo(): string
{
return $this->name;
}
}
// 继承 /扩展
class Stu extends Person
{
// 只需要 扩展父类的属性和方法
// 1、 属性扩展 扩展之前需要创建一个构造方法 继承扩展 相当于把父类除了 私有属性,其他都拿到了
// extends: 相当于把父类代码复制到当前类中(除Private成员外)
// protected string $name;
// public function __construct($name)
// {
// $this->name = $name;
// }
// protected function getInfo(): string
// {
// return $this->name;
// }
// 属性扩展
// 之前的
// protected string $name;
// 扩展的
private string $lesson;
private int $score;
// 2、方法扩展
// 构造方法
public function __construct($name, $lesson, $score)
{
// $this ->nam = $name;
// $this ->lesson = $lesson;
// $this ->score = $score;
// 简化 parent :引用父类 相当于执行了 父类的构造方法 获取所有能获取到的(除了私有
parent::__construct($name);
// $this ->name = $name;
$this->lesson = $lesson;
$this->score = $score;
}
// 自定义方法 拓展 注意 protected 要跟父类一样或者高于父 类 public
public function getInfo(): string
{
return parent::getInfo() . '同学, (' . $this->lesson . ' ) , 成绩: ' . $this->score .'<br>';
}
}
$stu = new Stu('小张', 'php', 90);
echo $stu->getInfo() ;
echo '<hr>';
// 2. 禁用父类, 仅允许通过它的子类来访问父类成员
// 把当前类,声明为"抽象类": abstract
// 如果类中有抽象方法,则这个类必须声明为抽象类
abstract class Demo1 {
public string $name = 'admin';
// 没有具体实现 叫抽象方法 前面必须加 abstract
// 如果某个方法没有具体实现,应该声明成抽象方法
abstract public static function getInfo($name);
}
class Demo2 extends Demo1 {
// 在子类中, 必须将父类中的抽象方法实现了
// public function getInfo($name)
// {
// return 'Hello, ' .$name;
// }
public static function getInfo($name)
{
return 'Hello, ' .$name;
}
}
// new Demo2();
echo Demo2::getInfo('朱老师');
echo '<hr>';
// 抽象类: 强制要求必须继承才能用
// 最终类: 禁止继承,直接用
// final: 不能扩展了
// final class Demo3
// {
// }
// class Demo4 extends Demo3
// {
// }
<?php
namespace _0815;
use _0815\Demo2 as _0815Demo2;
// 接口 升级版的抽象类
// abstract class = interface 接口
// 接口类
interface iUser{
// public string $name;
// // 如果 某个方法 没有具体实现,应该声明为抽象方法
// abstract public static function getInfo ($name);
// abstract public static function getInfo1 ($score);
// abstract public static function getInfo2 ($age);
// 接口里面两类成员 常量、方法
// 常量
public const NATION = 'CHINA';
// 方法 public
public function m1();
public function m2();
}
//工作类 实现了 接口的类 将接口类方法实现
// class Demo1 implements iUser{
// // 接口的抽象方法,必须在工作类中全部实现
// public function m1(){
// }
// public function m2(){
// }
// }
// 如果实现类 仅实现了接口 一部分抽象方法 应该为抽象类
// iUser 接口类固定写法
abstract class Demo2 implements iUser{
// 部分实现时,需要将类变为抽象类
public function m1(){
}
}
class Demo3 extends Demo2{
public function m2(){
}
}
// php是单继承 ,但是可以 使用接口多继承
interface A {
}
interface B {
}
interface C {
}
// Test类,同时从三个接口中获取成员,间接实现了"多继承"
// 用途:对于增删改查
class Test implements A,B,C {
}
interface iDb {
// 插入
public static function insert (array $data);
// 更新
public static function updata (array $data ,string $where );
// 删除
public static function delete (string $where );
// 查询
public static function select (array $option );
}
abstract class aDb {
// 插入
public static function insert (array $data){}
// 更新
public static function updata (array $data ,string $where ){}
// 删除
public static function delete (string $where ){}
// 查询
public static function select (array $option ){}
}
// 实现
class Db extends aDb {
}
<?php
namespace _0815;
// 全局成员:函数 常量、类、接口、全局有效,禁止重复声明
function hello(){
}
const A =1 ;
class B {
}
// 将第二个 hello 声明在另外一个空间中,不会重名了
namespace _0815_1;
function hello (){
}
const A =2;
class B {
}
<?php
// 命名空间解决了:全局成员的命名冲突,借鉴了同名文件可存入在不同的目录下面
namespace one;
class Demo1 {
public static string $name = '小猫';
}
// 当存在 命名空间时,全局成员应该使用完整的名称
// 类名 = 空间名称\类名
// ::class 获取 类的完整名称
echo Demo1::class.'<br>';
echo '<hr>';
namespace two;
class Demo1 {
public static string $name = '小狗';
}
echo Demo1::class.'<br>';
echo '<hr>';
// 跨空间访问
// 在two 里面访问 one
// 报错的 实际访问路径变成了 two\one\Demo1
// echo one\Demo1::$name;
// 跨空间访问 正确写法 从根空间/全局空间写起 开始查询 用反斜线 \
echo \one\Demo1::$name;
echo '<hr>';
echo \two\Demo1::$name;
<?php
// 命名空间类型、
// 1. 当前路径: 非限定名称, Index Index::show();
// 2. 相对路径: 限定名称, two\Index
// 3. 绝对路径: 完全限定名称, \one\two\Index
namespace _0815;
namespace one;
class Index {
public static function show(){
return __METHOD__;
}
}
// Index::show(); 非限定名称
// one\Index::show
echo Index::show();
echo '<hr>';
// 如果我在one空间中, 访问 one\two中的成员
// 方式一 绝对路径 完全限定名称
echo \one\two\Index::show(). '<br>';
// 方式二 限定名称
echo two\Index::show(). '<br>';
// 空间可以分层/分级管理
namespace one\two;
class Index {
public static function show(){
return __METHOD__;
}
}
// one\two\Index::show
echo Index::show();
echo '<hr>';
<?php
namespace _0815;
namespace one;
class Index {
public static function show(){
return __METHOD__;
}
}
echo two\three\Index::show();
echo '<hr>';
// use 默认使用完全限定名称的类名/绝对路径
// echo \one\two\three\Index::show();
// use 进行简化
use \one\two\three\Index as UserIndex;
echo UserIndex::show();
echo '<hr>';
namespace one\two\three;
class Index {
public static function show(){
return __METHOD__;
}
}
//---------------------------------------------
namespace four;
// 如果当前空间中的没有Index类,可以进一步的简化
// use one\two\three\Index as Index;
// 如果当前类别名与原始类名相同,可以不写
// 如果当前空间中有Index类, 就不能省去as
use one\two\three\Index;
echo Index::show() ;
echo '<hr>';
namespace five;
class Index {
public static function show(){
return __METHOD__;
}
}