>  기사  >  백엔드 개발  >  thinkphp3.2.0 setInc 메소드 소스 코드 PHP 예제 종합 분석

thinkphp3.2.0 setInc 메소드 소스 코드 PHP 예제 종합 분석

jacklove
jacklove원래의
2018-06-28 17:56:072066검색

아래 에디터는 좋은 참고 가치가 있는 thinkphp3.2.0 setInc 메소드의 소스 코드에 대한 종합적인 분석을 여러분과 공유할 것입니다. 모두에게 도움이 되기를 바랍니다. 편집기를 따라 살펴보겠습니다

먼저 setInc의 공식 예를 살펴보겠습니다:

필드와 자동 증가 값이 필요합니다(기본값은 1)

We 다음 예를 통과하여 하위 레이어가 어떻게 구현되는지 단계별로 분석해 보겠습니다.

<?php
namespace Home\Controller;
use Think\Controller;

class TestController extends Controller {
  public function test() {
    $tb_test = M(&#39;test&#39;);
    $tb_test->where([&#39;id&#39;=>1])->setInc(&#39;test_number&#39;,2); //每次添加2
    dump($tb_test->getLastSql());
    //string(67) "UPDATE `tb_test` SET `test_number`=test_number+2 WHERE ( `id` = 1 )"
  }
}

첫 번째 단계는 setInc 메소드의 소스 코드를 찾는 것입니다.

여기서 제가 사용한 것은 phpstrom 전역 검색 방법으로 setInc는 projThinkPHPLibraryThinkModel.class.php

/**
   * 字段值增长
   * @access public
   * @param string $field 字段名
   * @param integer $step 增长值
   * @return boolean
   */
  public function setInc($field,$step=1) {
    return $this->setField($field,array(&#39;exp&#39;,$field.&#39;+&#39;.$step));
  }

아래에 있습니다. 여기서는 setField 방법이 사용된 것을 볼 수 있으며, 그런 다음 exp 사용자 정의 표현식을 사용하여 $field = $field + $step을 설정합니다. 이 시점에서 우리는 원리를 조금 이해하게 되었습니다.

하지만 또 질문이 생깁니다. setField는 어떻게 구현되나요? 동일한 파일에서 setField 메소드를 찾으십시오.

/**
   * 设置记录的某个字段值
   * 支持使用数据库字段和方法
   * @access public
   * @param string|array $field 字段名
   * @param string $value 字段值
   * @return boolean
   */
  public function setField($field,$value=&#39;&#39;) {
    if(is_array($field)) {
      $data      =  $field;
    }else{
      $data[$field]  =  $value;
    }
    return $this->save($data);
  }

여기서 일반적으로 사용되는 save 메소드를 볼 수 있습니다. 여기서 $data[$field] = $value는 실제로 $data['test_number'] = array입니다. ("exp","test_number+2")

그런 다음 가장 일반적으로 사용되는 저장 방법을 살펴보겠습니다.

/**
   * 保存数据
   * @access public
   * @param mixed $data 数据
   * @param array $options 表达式
   * @return boolean
   */
  public function save($data=&#39;&#39;,$options=array()) {
    if(empty($data)) {
      // 没有传递数据,获取当前数据对象的值
      if(!empty($this->data)) {
        $data      =  $this->data;
        // 重置数据
        $this->data   =  array();
      }else{
        $this->error  =  L(&#39;_DATA_TYPE_INVALID_&#39;);
        return false;
      }
    }
    // 数据处理
    $data    =  $this->_facade($data);
    // 分析表达式
    $options  =  $this->_parseOptions($options);
    $pk     =  $this->getPk();
    if(!isset($options[&#39;where&#39;]) ) {
      // 如果存在主键数据 则自动作为更新条件
      if(isset($data[$pk])) {
        $where[$pk]     =  $data[$pk];
        $options[&#39;where&#39;]  =  $where;
        unset($data[$pk]);
      }else{
        // 如果没有任何更新条件则不执行
        $this->error    =  L(&#39;_OPERATION_WRONG_&#39;);
        return false;
      }
    }
    if(is_array($options[&#39;where&#39;]) && isset($options[&#39;where&#39;][$pk])){
      $pkValue  =  $options[&#39;where&#39;][$pk];
    }    
    if(false === $this->_before_update($data,$options)) {
      return false;
    }    
    $result   =  $this->db->update($data,$options);
    if(false !== $result) {
      if(isset($pkValue)) $data[$pk]  = $pkValue;
      $this->_after_update($data,$options);
    }
    return $result;
  }

가장 중요한 것은 $options = $this->_parseOptions( $ options); and $result = $this->db->update($data,$options); 전자는 SQL 연결을 위해 매개변수를 문자열 배열로 변환하고, 후자는 projtptestThinkPHPLibraryThinkDb.class.php 업데이트 메소드를 호출합니다. :

/**
   * 更新记录
   * @access public
   * @param mixed $data 数据
   * @param array $options 表达式
   * @return false | integer
   */
  public function update($data,$options) {
    $this->model =  $options[&#39;model&#39;];
    $sql  = &#39;UPDATE &#39;
      .$this->parseTable($options[&#39;table&#39;])
      .$this->parseSet($data)
      .$this->parseWhere(!empty($options[&#39;where&#39;])?$options[&#39;where&#39;]:&#39;&#39;)
      .$this->parseOrder(!empty($options[&#39;order&#39;])?$options[&#39;order&#39;]:&#39;&#39;)
      .$this->parseLimit(!empty($options[&#39;limit&#39;])?$options[&#39;limit&#39;]:&#39;&#39;)
      .$this->parseLock(isset($options[&#39;lock&#39;])?$options[&#39;lock&#39;]:false)
      .$this->parseComment(!empty($options[&#39;comment&#39;])?$options[&#39;comment&#39;]:&#39;&#39;);
    return $this->execute($sql,$this->parseBind(!empty($options[&#39;bind&#39;])?$options[&#39;bind&#39;]:array()));
  }

결국 드라이버 클래스 projThinkPHPLibraryThinkDbDriverMysql.class.php의 실행 메소드가 실제로 사용됩니다.

/**
   * 执行语句
   * @access public
   * @param string $str sql指令
   * @return integer|false
   */
  public function execute($str) {
    $this->initConnect(true);
    if ( !$this->_linkID ) return false;
    $this->queryStr = $str;
    //释放前次的查询结果
    if ( $this->queryID ) {  $this->free();  }
    N(&#39;db_write&#39;,1);
    // 记录开始执行时间
    G(&#39;queryStartTime&#39;);
    $result =  mysql_query($str, $this->_linkID) ;
    $this->debug();
    if ( false === $result) {
      $this->error();
      return false;
    } else {
      $this->numRows = mysql_affected_rows($this->_linkID);
      $this->lastInsID = mysql_insert_id($this->_linkID);
      return $this->numRows;
    }
  }

마지막으로 가장 낮은 수준의 mysql_query를 사용하여 SQL 문을 실행합니다.

지금까지 setInc의 소스코드를 대략적으로 살펴보았습니다. 저는 모두가 setInc가 어떻게 실행되는지 더 잘 이해하고 있다고 믿습니다.

thinkphp3.2.0 setInc 메소드의 소스 코드에 대한 위의 종합 분석은 모두 편집자가 공유한 내용이므로 참고가 되기를 바라며 PHP 중국어 웹사이트를 지원해 주시길 바랍니다.

관련 권장 사항:

PHP 사용자 상태를 저장하기 위해 바이너리를 사용하는 PHP 팁 PHP 예제를 요약하는 여러 가지 방법


위 내용은 thinkphp3.2.0 setInc 메소드 소스 코드 PHP 예제 종합 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.