问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

thinkphp中model类自动完成功能 回调函数能不能获取其他字段的值

发布网友 发布时间:2022-04-29 07:28

我来回答

2个回答

懂视网 时间:2022-04-29 11:49

主要的思想是利用call_user_func_array()和容器结合使用的。

核心代码,理解都在注释中:

<?php
//reqeuestFacade.php
 namespace facade{
 class Request extends Facade{
  public function getFacadeName(){
  return 'request';
  }
 }
 }

?>

<?php
//facade.php
namespace facade{
 class Facade{

 public static function createFacade(){
  $class = static::class; //在这个获取的$class其实是facade
eqeust
  //在这里利用static::得到getFacadeName,返回真正的request的变量名
  $facadeClass = static::getFacadeName();

  if ($facadeClass) {
  $class = $facadeClass;
  } elseif (isset(self::$bind[$class])) {
  $class = self::$bind[$class];
  }
  //echo $class;
  利用容器去获取reqeust,而不是facade
eqeust
  return Container::get($class);
 }
 
 public static function __callStatic($method, $params)
 {
  return call_user_func_array([static::createFacade(), $method], $params);
 }
 }
}


?>

下面测试代码

reqeust.php

<?php

class Request{
 public $name = 'Real Request';

 public function sayName(){
 echo $this->name;
 }

}

?>

test.php

<?php

 use facadeRequest;

 include "Container.php";
 include "Facade.php";
 include "RequestFacade.php";
 include "Request.php";

 Request::sayName();

?>

推荐教程:thinkphp教程

热心网友 时间:2022-04-29 08:57

这个是tp中add的源码,也就是Model.class.php中的add方法,你可以粗略看下,

public function add($data='',$options=array(),$replace=false) {
    if(empty($data)) {
        // 没有传递数据,获取当前数据对象的值
        if(!empty($this->data)) {
            $data           =   $this->data;
            // 重置数据
            $this->data     = array();
        }else{
            $this->error    = L('_DATA_TYPE_INVALID_');
            return false;
        }
    }
    // 数据处理
    $data       =   $this->_facade($data);
    // 分析表达式
    $options    =   $this->_parseOptions($options);
    if(false === $this->_before_insert($data,$options)) {
        return false;
    }
    // 写入数据到数据库
    $result = $this->db->insert($data,$options,$replace);
    if(false !== $result && is_numeric($result)) {
        $pk     =   $this->getPk();
          // 增加复合主键支持
        if (is_array($pk)) return $result;
        $insertId   =   $this->getLastInsID();
        if($insertId) {
            // 自增主键返回插入ID
            $data[$pk]  = $insertId;
            if(false === $this->_after_insert($data,$options)) {
                return false;
            }
            //这个是最终返回的数据(也就是自增的id)
            return $insertId;
        }
        if(false === $this->_after_insert($data,$options)) {
            return false;
        }
    }
    return $result;
}

源码里如果主键是自增的,那么返回当前自增的id,如果不是自增,比如字符串,会返回Driver.class.php中insert方法的返回值也就是执行成功影响的行数。所以,应该是不可以返回其他参数的。你可以在通过M('table')->find($id)把需要的东西查出来。。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
whirlpool如何制热 如何查被录取到的专业 怎样查被录取的专业 录取后怎样查询录取的专业 录取专业怎么查 已被录取怎么查专业 ghs网络语什么意思_ghs网络语意思出处含义介绍 纸箱企业管理软件 ghs什么意思网络(ghs什么意思网络用语) 《喜羊羊与灰太狼》大结局 我刚满20岁,可以申请任性付分期吗? 哪些人可以申请开通任性贷? 可以任性付吗 任性付黑户可以开通吗 我想要开通苏宁金融的任性付,你们知不知道需要什么条件啊? 我爸想申请苏宁金融任性付,这个有年龄限制吗? 申请任性付需要抵押物或者担保人吗? 我刚满22岁,可以申请任性付分期吗? 身份证不满18周岁不能开通任性付吗? 今天用了一下任性付,但是提示申请被拒怎么办? 开通任性付需要满足哪些条件?需要抵押资产吗? 为什么23岁申请不了任性付 申请任性付要什么条件吗? 任性付的要求年龄 申请任性付有没有年龄要求?具体是多少? 马自达6音响怎么调? 马自达发动机有哒哒的响声是怎么回事?? 马自达cx一5发动机声音怎么那么大 马自达停在原地会发出吱吱声是怎么回事? 马自达cx一5发动机声音为什么那么大声? ...但用小米盒子投屏到电视上网速只能达到32/34kb,缓冲的巨慢_百度知... 编辑记者资格证考试的科目有哪些? 报纸编辑资格证考试考哪些科目 iphone小米盒子投屏卡顿 小米盒子3增强版 投屏手机的时候特别卡 怎么回事 我用手机上看腾讯视频电影可以正常看,但用小米盒子投屏到电视上网速慢是为什么? 关于初级编辑资格证的问题 编辑证考试什么时间,需要复习什么 小米盒子多屏互动卡顿是盒子原因还是电视机原因 初级编辑资格证教材 现在家里用的小米盒子看电视卡顿啊,怎么解决呢? 请问编辑资格考试和出版专业资格考试是不是就是一个东西啊? 我昨天晚上做了一个梦。梦到我的眼角膜被我拿下来了。就像拿隐形眼镜一... 梦见两只眼睛被薄膜笼罩着然后自己给撕下来了 感觉很舒服凉爽是什么意思啊 梦见我第一次戴con,脱下来时不小心扯到眼角膜,然后眼睛就变得像牛眼那... 梦见儿子的的眼角膜被抠下来放了几天又装上去 雪花酥做出来有点粘牙是什么原因,求指导 哪些网站可以下载平面设计源文件的 怎么看股票macd30分钟底背离 怎么识别股价拉升前夕的洗盘打压?