题目1:类的封装
1.php文件:
<?php
// *类的封装
class Sanguo{
// *private:私有,(把它封装起来)
// *$data:容器/数组来表示
private array $data=['troops'=>'一百万','food'=>'约二十万石','project'=>'直取江东'];
// *采用属性拦截器来过滤
public function __get($name)
{
if(array_key_exists($name,$this->data)){
return $this->data[$name];
}else {
return "$name 属性不存在";
}
}
}
$sanguo=new SanGuo();
echo $sanguo->troops,'<br>';
echo $sanguo->food,'<br>' ;
echo $sanguo->project,'<br>';
2.浏览器运行效果图:
题目2:拦截非法访问
1.php文件:
<?php
// *拦截非法访问
class User1{
// *1.拦截非静态方法的非法访问
public function __call($name, $args)
{
// *第一个参数是方法名称
// *第二个参数是以数组表示的参数列表
printf('方法名: %s<br>参数列表: <pre>%s</pre>', $name, print_r($args, true));
}
// *2拦截静态方法的非法访问
public static function __callStatic($name, $args)
{
// *第一个参数是方法名称
// *第二个参数是以数组表示的参数列表
printf('方法名: %s<br>参数列表: <pre>%s</pre>', $name, print_r($args, true));
}
}
$user1=new User1();
// *当访问一个并不存在的非静态方法时
$user1->hello('张三','12345');
// *当访问一个并不存在的静态方法时
User1::welcome('李四','56789');
2.浏览器运行效果图:
题目3:自动拦截的用途
1.php文件:
<?php
// *自动拦截的用途
// *查询方法库
class Query
{
// *当这个查询类实例化时,应该自动连接数据库
// *public function __construct()
// *{
// * self::connect();
// *}
public function table($table)
{
return $this;
}
public function where($table)
{
return $this;
}
public function find()
{
}
}
//* 查询入口类
class Db
{
public static function __callStatic($name, $arguments)
{
// *所有查询操作在此完成,单入口查询
return call_user_func_array([new Query(), $name], $arguments);
}
}
Db::table('think_user')->where('id', 1)->find();
2.浏览器运行效果图:
题目4:类的继承
1.php文件:
<?php
// *类的继承
// *父类
class SanXi{
// *属性
public string $capital='太原市';
private string $GDP='两万五千亿';
protected string $name;
// *构造方法
public function __construct($name)
{
$this->name=$name;
}
// *自定义方法
protected function getInfo():string{
return $this->name;
}
}
// *子类继承父类
class CanZi extends SanXi{
private string $agriculture;
private string $education;
public function __construct($name,$agriculture,$education)
{
parent::__construct($name);
$this->agriculture=$agriculture;
$this->education=$education;
}
public function getInfo():string{
return parent::getInfo().'今年农业:'.$this->agriculture.',教育:'.$this->education.'<br>';
}
}
$canzi=new CanZi('长治市','粮食丰收','新建一所大学');
echo $canzi->getInfo();
2.浏览器运行效果图:
题目5:抽象类及其继承
1.php文件:
<?php
// *抽象类及其继承
// *1.抽象类
abstract class GuangDong{
public string $capital='广州市';
abstract public static function getInfo($name);
}
// *2.抽象类的继承
class GusngZhou extends GuangDong{
// *子类必须将父类的抽象方法加上实体
public static function getInfo($name){
return '你好,'.$name;
}
}
echo GusngZhou::getInfo('祖国的南大门广州');
2.浏览器运行效果图:
题目6:接口与实现类
1.php文件:
<?php
// *接口与实现类
//*1.接口
interface iSanGuo{
// *常量
public const monarch='曹操';
// *方法:public
public function a1();
public function a2();
}
// *2.实现类:实现了接口的类
class WeiGuo implements iSanGuo{
public function a1()
{
}
public function a2()
{
}
}
// *3.如果一个实现类没有实现接口的全部方法,则必须在前面加上关键字:abstract
abstract class SuGuo implements iSanGuo
{
public function a1()
{
}
}
class WuGuo extends SuGuo{
public function a2()
{
}
}
// *4.一个实现类可以同时实现多个接口,及间接实现了多继承
interface iWei{
}
interface iSu{
}
interface iWu{
}
// *一个晋类,同时从魏,蜀,吴三个接口中获取成员,间接实现了多继承
class Jing implements iWei,iSu,iWu{
}
2.浏览器运行效果图:
题目7:数据库接口中的增删改查方法的实现
1.php文件:
<?php
// *数据库接口中的增删改查方法的实现
// *1.一个学生数据库接口
interface iStuDb{
// *insert:增加数据
public static function insert(array $data);
// *update:修改数据
public static function update(array $data,string $where);
// *delete:删除数据
public static function delete(string $where);
// *select:查询数据
public static function select(array $options);
}
// *2.用一个抽象类实现学生数据库接口中的增删改查方法
abstract class StuDb{
// *insert:增加数据
public static function insert(array $data){
}
// *update:修改数据
public static function update(array $data,string $where){
}
// *delete:删除数据
public static function delete(string $where){
}
// *select:查询数据
public static function select(array $options){
}
}
class Stu extends StuDb{
}
2.浏览器运行效果图:
题目8:命名空间的意义是什么?
1.php文件:
<?php
// *命名空间
// *1.命名空间的意义是什么?
namespace _221112;
function sanguo(){
}
namespace _221112b;
function sanguo(){
}
namespace a;
2.浏览器运行效果图:
题目9:命名空间的3种类型及命名空间的分层
1.php文件:
<?php
// *命名空间的3种类型
// *1.当前路径:非限定名称
// *2.相对路径:限定名称
// *3.绝对路径:完全限定名称
namespace a;
class Index{
public static function show(){
return __METHOD__;
}
}
echo Index::show().'<br>';
namespace one;
class Index1{
public static function show(){
return __METHOD__;
}
}
echo Index1::show() . '<br>';
// *分层(one在上,two在下)
namespace one\two;
class Index2
{
public static function show()
{
return __METHOD__;
}
}
echo Index2::show() . '<br>';
// echo \one\two\Index2::show() . '<br>';
// *起别名
use one\tww\Index2 as Index;
echo Index2::show().'<br>';
2.浏览器运行效果图: