1. 类加载的三种方式
示例将在frame这个目录下进行,先创建子目录app,在创建app的子目录controller,在controller里面新建文件Controller.php,在frame根目录下创建index1.php
Controller.php 如下:
namespaceapp\controller;
classController
{
publicstaticfunctionhello()
{
return'方法名是: '.__METHOD__;
}
}
1.1 方式一:requireindex1.php 如下:
require__DIR__."/app/controller/Controller.php";
useapp\controller\Controller;
echoController::hello();
1.2 方式二:注册自动加载器index2.php 如下:
spl_autoload_register(function($class){
$path=str_replace("\\",DIRECTORY_SEPARATOR,$class);
$classFile=__DIR__.DIRECTORY_SEPARATOR.$path.".php";
require$classFile;
});
useapp\controller\Controller;
echoController::hello();
1.3 方式三:使用composer的autoload先生成composer.json,内容为空,就一对花括号{}
执行终端命名 composer install,成功以后会自动生成vendor目录,目录下有个autoload.php
在入口文件中引入autoload.php
修改composer.json的属性
{
"autoload":{
"files":[
"app/controller/Controller.php"
]
}
}
终端执行命名composer dumpautoload
index3.php 如下:
require__DIR__."/vendor/autoload.php";
useapp\controller\Controller;
echoController::hello();
2. autoload 字段的意义
2.1 files 字段:加载任意位置的类文件
接上面的示例,在frame目录下,再创建子目录lib,新建文件Test1.php,如下:
namespacetest;
classTest1
{
publicstaticfunctionshow()
{
return'方法名是: '.__METHOD__;
}
}
修改composer.json,如下:
{
"autoload":{
"files":[
"app/controller/Controller.php",
"lib/Test1.php"
]
}
}
执行终端命名composer dumpautoload
index4.php 如下:
require__DIR__."/vendor/autoload.php";
useapp\controller\Controller;
usetest\Test1;
echoController::hello(),'
';
echoTest1::show();
小结:想要使用某个类,直接在files字段中加入相应的类文件路径即可,修改后记得执行终端命名
2.2 classmap 字段:类映射,实现类的批量注册
接上面示例,如果同目录下有很多的类,每次都去手动引入类文件比较麻烦,而使用classmap ,可以将类文件映射到路径上,同目录下的类文件只需要引入一次即可
示例:在上面示例的lib目录下,再新建文件Test2.php,如下:
namespacetest;
classTest2
{
publicstaticfunctionshow()
{
return'方法名是: '.__METHOD__;
}
}
如果按照files字段,需要在composer.json中再去增加lib/Test2.php,显然这样有点麻烦了,而使用classmap 呢,如下:
{
"autoload":{
"classmap":[
"app/controller",
"lib"
]
}
}
终端执行命名composer dumpautoload
index4.php,如下:
require__DIR__."/vendor/autoload.php";
useapp\controller\Controller;
usetest\Test1;
usetest\Test2;
echoController::hello(),'
';
echoTest1::show(),'
';
echoTest2::show(),'
';
2.3 psr-4字段:将类命名空间与路径绑定
在开发中,类文件一般会满足两个条件:
类的命名空间和当前类文件的路径一致
类名与类文件名一致
这种命名规范可以叫做psr-4规范,而满足这种规范的,一般都会使用psr-4字段来实现映射
修改composer.json,如下:
{
"autoload":{
"psr-4":{
"app\\controller\\":"app/controller",
"test\\":"lib"
}
}
}
3. 自定义框架
本次示例,新建frame2这个根目录,所有文件将存放在这个目录下,使用MVC架构,Model和View使用第三方包,业务逻辑写在Controller中
下载模型包:catfan/medoo,终端输入命令composer require catfan/medoo
下载视图包:league/plates,终端输入命令composer require league/plates
创建自己的框架核心代码,继承第三方包,放入frame2/core目录下
Model.php :
namespacecore;
// 模型类
// 继承第三方包catfan\medoo
useMedoo\Medoo;
classModelextendsMedoo
{
// 连接数据库
publicfunction__construct(){
$options=[
'database_type'=>'mysql',
'database_name'=>'first',
'server'=>'php.edu',
'username'=>'root',
'password'=>'root'
];
parent::__construct($options);
}
}
View.php :
namespacecore;
useLeague\Plates\Engine;
classViewextendsEngine
{
private$templates;
publicfunction__construct($path)
{
$this->templates=parent::__construct($path);
}
}
创建自己的应用,分别放于app/models、app/views、app/controllers目录下
app/models中StudentModel.php :
namespaceapp\models;
usecore\Model;
classStudentModelextendsModel
{
publicfunction__construct(){
parent::__construct();
}
}
app/controllers中StudentController.php :
namespacecontrollers;
classStudentController
{
// 依赖注入
private$model=null;
private$view=null;
publicfunction__construct($model,$view)
{
$this->model=$model;
$this->view=$view;
}
// 用来测试的
publicfunctiontest(){
echo'111';
}
// 查询
publicfunctionselect()
{
// 获取数据
$users=$this->model->select("student",["username","age","tel"],["id[>=]"=>1200,"LIMIT"=>10]);
// return $users;
// 渲染模板(同时进行模板赋值)
return$this->view->render('student/list',['users'=>$users]);
}
}
app/views/student中list.php:
Documenttable{
width:500px;
border:1pxsolid black;
border-collapse:collapse;
text-align:center;
margin:auto;
}
th,
td{
border:1pxsolid black;
padding:8px;
}
用户名年龄电话操作
=$this->e($user['username'])?>=$this->e($user['age'])?>=$this->e($user['tel'])?>编辑
删除