就是一个开源系统
系统某些功能函数文件路径为:/cms/Model/Member.php
<?php
namespace Phpcmf\Model;
class Member extends \Phpcmf\Model {
public function author($uid) {
if (!$uid) {
return dr_lang('游客');
}
return $this->username($uid);
}
}
此文件是系统文件 - 不要修改当cms核心更新时会被覆盖
二次开发时,支持复制出去修改 增加 功能函数方法,操作方法:
1、新建文件:/My/Member.php
2、新写方法体:
<?php
namespace My\Model;
// 重写类
class Member extends \Phpcmf\Model\Member{
//开始写你的方法
public function login_TTT($uid) {
return $uid.'登录成功';
}
}
就是这样 当我调用:Phpcmf\Model\Member 时 author 和 login_TTT 都可以使用。
请问一下这样是如何实现的啊?我试图用webman 也这样实现但是没搞懂我应该怎么写才会让我自己新建的文件被加载进去。
看不明白,B extends A之后,A可以使用B新加的方法?
你说的是My\Model\Member可以使用author和login_TTT,还是Phpcmf\Model\Member?
A:Phpcmf\Model\Member 是系统定义的各种功能方法
B:My\Model\Member 是二开自己定义的各种方法
当你在中controller 中使用时 use Phpcmf\Model\Member 后:
可以调用A B 2个文件中的所有方法 这个意思
参考:https://www.xunruicms.com/doc/1277.html 我想知道它是如何实现的
你这个文档,说的不就是继承么???我怎么感觉你理解错他的意思了?
就类似Workerman的Request类你想新增方法,就继承这个Request类后新增方法就好,Workerman更新也不会影响你使用的方式
他的意思应该是Phpcmf\Model\Member可以调用author和login_TTT,也就是用父类调用子类的方法
@liudada1204 我知道,但是这个文档说的不就是继承么,没说父类调用子类啊
@nitron 是的,文档应该就是你说的那意思
webman 中应当如何做?
我的意思:
比如目录:/plugin/user/app/api/
下面的某个文件(testa.php )
然后我在根目录下新建一个目录+文件:ceshi\testb.php:
class Test extends \plugin\user\app\api\Testa {
}
在写项目调用时,我在controller下面比如新建个文件Abccontroller :
use plugin\user\app\api\testa
就可以调用到
\plugin\user\app\api\testa.php 和 ceshi\testb.php 这2个文件里面的所有方法
而实际测试只能调用到:\plugin\user\app\api\testa.php 内的方法 并不能调用到:ceshi\testb.php 里面自己定义的方法
那就照下面北月+muyu说的,那个可以,不过限制太大,extends出来的model换个目录就不行了,除非你加入多个目录
我试过了。使用体验太差了。当有错误或者返回某些前置的code时 取不到直接就跳过了
你这个Phpcmf也不行吧?确定测试过?要用他框架Phpcmf/Service去调用才行吧?
的确如楼上兄台所言
好像是通过Service 的
最终调用方法为:
\Phpcmf\Service::M('member')->login_TTT(1);
请教一下webman 如何想实现如此,有没有教程 案例,我没搞懂这是怎么实现的!我写了继承方法但是压根没作用
看北月的回答,看了下他那个代码,一样的道理
\Phpcmf\Service::M($name = '', $namespace = '')
不带命名空间就扫描My目录下对应的Model,带了就扫码指定命名空间的Model
结论:就是继承,明显是不是什么父类调用子类的方法,跟北月说的方式大差不差
webman 的话 我是应该把它写到:app/functions.php 还是每个pulgin 下面server 定义一个,我就是没想到好方法,我想每个plugin下的应用核心由我开发更新,同时允许用户在根目录:diy/同plugin应用名/ 下面新建文件自定义开发,这样我负责升级plugin 应用下面核心,这样当我更新时直接覆盖,从而不会影响用户自己二开的代码
规定重写后的文件必须放到指定目录,比如
ext/model
在
composer.json
新增一个psr-4
的自动加载项,"ext\\": "ext"
,执行composer dump-autoload
规定不要在
controller
中单独使用model
类,可以在controller
基类中写一个方法,或者在助手函数中实现也行,哪里实现不重要,比如就叫:getModelInstance
在
controller
中调用传入model
名,比如你的CMS
内核有一个会员相关的model
,那么调用的时候是这样子的:PS: 其实说到底就是优先使用
ext/model
下的model
类,更进一步的做法可以封装logic
或service
层,思路就是这样子,其它的可以自己扩展。我试了一下不是这个效果 不是如此
调用的时候use 调用命名空间后直接:Member::login_TTT(123) 就和平常的一样提示那些都没问题
他说这个方法可以实现的,__callStatic函数做代理去尝试实例化ext/model下面的,找不到在实例化默认的
框架使用容器技术的话可以替换容器里面实现