php对象中使用两个或多个箭头->

本文详细介绍了如何在PHP中实现链式调用,通过具体的数据库查询实例,展示了table(), where(), order() 和 limit()等方法的使用,以及这些方法如何通过返回$this实现连续调用。

今天同事突然问起来php对象中的多个箭头->是怎么使用的

例如$obj->a()->b()-c();
那么类是怎么写的呢?像TP那也 $obj->where()->order()->select()这样的查询语句,然后就写个最基本简单查询数据库例子出来可以参考一下。

首先我们建立一个数据库叫mydata,其中的一个表名是 fa_news

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for fa_news
-- ----------------------------
DROP TABLE IF EXISTS `fa_news`;
CREATE TABLE `fa_news`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL,
  `createtime` int(11) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = MyISAM AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of fa_news
-- ----------------------------
INSERT INTO `fa_news` VALUES (1, '我是一个标题', '这里尚内容', 1570692387);
INSERT INTO `fa_news` VALUES (2, '我是一个标题1', '这里尚内容1', 1570692387);
INSERT INTO `fa_news` VALUES (3, '我是一个标题2', '这里尚内容2', 1570692387);
INSERT INTO `fa_news` VALUES (4, '我是一个标题3', '这里尚内容3', 1570692387);
INSERT INTO `fa_news` VALUES (5, '我是一个标题4', '这里尚内容4', 1570692387);

SET FOREIGN_KEY_CHECKS = 1;

然后我们建一个PHP文件,例如 db.php 代码如下

<?php

class db
{

    public $dbms = 'mysql'; //数据库类型
    public $host = 'localhost'; //数据库主机名
    public $dbName = 'mydata'; //使用的数据库
    public $user = 'root'; //数据库连接用户名
    public $pass = 'root'; //对应的密码
    public $prefix = 'fa_';//表前缀
    public $db;
    public $op=[];

    public function __construct()
    {
      $dsn="$this->dbms:host=$this->host;dbname=$this->dbName";

        try {
        //默认这个不是长连接,如果需要数据库长连接,需要最后加一个参数:array(PDO::ATTR_PERSISTENT => true) 
        //$this->db = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true));
          $this->db = new PDO($dsn, $this->user, $this->pass); //初始化一个PDO对象
        } catch (PDOException $e) {
            die("Error!: " . $e->getMessage() . "<br/>");
        }
    }

    public function table($name){
      $this->op['tablename']=$this->prefix.$name;
      return $this;
    }

    public function where($where){
      $this->op['where']=$where;
      return $this;
    }
    public function order($string){
      $this->op['order']=$string;
      return $this;
    }
    public function limit($string){
      $this->op['limit']=$string;
      return $this;
    }

    public function getsql(){

      $sql="SElECT * from ".$this->op['tablename'];
      $sql.=isset($this->op['where'])&&trim($this->op['where'])?" where ".$this->op['where']:"";
      $sql.=isset($this->op['order'])&&trim($this->op['order'])?" order by ".$this->op['order']:"";
      $sql.=isset($this->op['limit'])&&trim($this->op['limit'])?" limit ".$this->op['limit']:"";
      return $sql;
    }

    public function select(){
      $sql=$this->getsql();
      $sth=$this->db->prepare($sql);
      $sth->execute();
      $result = $sth->fetchAll();
      return $result;
    }

    public function find(){
      $sql=$this->getsql();
      $sth=$this->db->prepare($sql);
      $sth->execute();
      $result = $sth->fetch(PDO::FETCH_ASSOC);
      return $result;

    }

}

$obj = new db();
$res=$obj->table('news')->order('id asc')->where('')->limit('')->select();
//where()/order()/limit()不掉用或者参数是空都是可以的
echo "<pre>";
print_r($res);


只有为什么可以用多个-> 那是因为方法 return $this;
这样就都懂了吧。其中 table() where() order() limit() 顺序可以不分先后。
这个只是简单的数据库查询,只写了几个简单的方法。
运行的结果就如下

Array
(
    [0] => Array
        (
            [id] => 1
            [0] => 1
            [title] => 我是一个标题
            [1] => 我是一个标题
            [content] => 这里尚内容
            [2] => 这里尚内容
            [createtime] => 1570692387
            [3] => 1570692387
        )

    [1] => Array
        (
            [id] => 2
            [0] => 2
            [title] => 我是一个标题1
            [1] => 我是一个标题1
            [content] => 这里尚内容1
            [2] => 这里尚内容1
            [createtime] => 1570692387
            [3] => 1570692387
        )

    [2] => Array
        (
            [id] => 3
            [0] => 3
            [title] => 我是一个标题2
            [1] => 我是一个标题2
            [content] => 这里尚内容2
            [2] => 这里尚内容2
            [createtime] => 1570692387
            [3] => 1570692387
        )

    [3] => Array
        (
            [id] => 4
            [0] => 4
            [title] => 我是一个标题3
            [1] => 我是一个标题3
            [content] => 这里尚内容3
            [2] => 这里尚内容3
            [createtime] => 1570692387
            [3] => 1570692387
        )

    [4] => Array
        (
            [id] => 5
            [0] => 5
            [title] => 我是一个标题4
            [1] => 我是一个标题4
            [content] => 这里尚内容4
            [2] => 这里尚内容4
            [createtime] => 1570692387
            [3] => 1570692387
        )

)
toggleMainSystem(this),点击主系统旁边的icon图标就能展示对应同批次下的子系统的数据,再点击就隐藏,应该怎么写js <?php if(isset($release->isMainSystem)&& !empty($release->isMainSystem)): ?> <?php if($release->isMainSystem == 'main'): ?> <tr data-id='<?php echo $releaseID ?>'> <td class='text-left' title='<?php echo $release->name?>'> <?php echo html::a($this->createLink('projectrelease', 'view', 'releaseID=' . $releaseID), $releaseID);?> </td> <td class='text-left' style='display:flex;align-items:center'> <?php if($release->toggle == 1):?> <icon class='icon icon-caret-right' onclick='toggleMainSystem(this)'></icon> <?php endif;?> <div class='mainsystem'><?php echo $lang->weekly->mainSystem;?></div> <?php echo (($release->deleted) ? "<span class='label label-danger' style='margin-right: 12px;'>{$lang->release->deleted}</span>" : '') . html::a($this->createLink('projectrelease', 'view', 'releaseID=' . $releaseID), $release->name);?> </td> <?php elseif($release->isMainSystem == 'auxiliary'):?> <?php if($release->flag == 1):?> <tr data-id='<?php echo $releaseID ?>' class="hidden"> <td class='text-left' title='<?php echo $release->name?>'> <?php echo html::a($this->createLink('projectrelease', 'view', 'releaseID=' . $releaseID), $releaseID);?> </td> <td class='text-left' style='display:flex;align-items:center'> <div class='childsystem'><?php echo $lang->weekly->auxiliarySystem;?></div> <?php else:?> <tr data-id='<?php echo $releaseID ?>'> <td class='text-left' title='<?php echo $release->name?>'> <?php echo html::a($this->createLink('projectrelease', 'view', 'releaseID=' . $releaseID), $releaseID);?> </td> <td class='text-left' style='display:flex;align-items:center'> <div class='singlechildsystem'><?php echo $lang->weekly->auxiliarySystem;?></div> <?php endif;?> <?php echo (($release->deleted) ? "<span class='label label-danger' style='margin-right: 12px;'>{$lang->release->deleted}</span>" : '') . html::a($this->createLink('projectrelease', 'view', 'releaseID=' . $releaseID), $release->name);?> </td> <?php endif; ?> <?php else: ?> <tr data-id='<?php echo $releaseID ?>'> <td class='text-left' title='<?php echo $release->name?>'> <?php echo html::a($this->createLink('projectrelease', 'view', 'releaseID=' . $releaseID), $releaseID);?> </td> <td class='text-left'><?php echo (($release->deleted) ? "<span class='label label-danger' style='margin-right: 12px;'>{$lang->release->deleted}</span>" : '') . html::a($this->createLink('projectrelease', 'view', 'releaseID=' . $releaseID), $release->name);?></td> <?php endif; ?> <td class='text-center'><?php $releaseSource = $release->fromBaseline ? 'baseline' : 'outofplan'; echo $lang->weekly->releaseSourceList[$releaseSource];?></td> <td class='text-center'><?php echo !empty($release->product) ? html::a($this->createLink('product', 'view', 'productID=' . $release->product), $products[$release->product]) : '';?></td> <td class='text-center'><?php echo (isset($release->baselineDate) and !helper::isZeroDate($release->baselineDate)) ? $release->baselineDate : ''?></td> <td class='text-center'><?php echo (!empty($release->date) and !helper::isZeroDate($release->date)) ? $release->date : ''?></td> <td class='text-center' style="color:<?php echo $release->urgent == 'yes' ? 'red' : '';?>"><?php echo !empty($release->urgent) ? $lang->release->urgentTypeList[$release->urgent] : '';?></td> <td class='text-center'><?php echo !empty($release->progress) ? html::a(helper::createLink('sync', 'jumpWithSSO', 'url=' . base64_encode($release->progress)), zget($lang->release->releaseStatusList, $release->releaseStatus, '') , '_blank', "title='{$lang->release->progress}'") : zget($lang->release->releaseStatusList, $release->releaseStatus, '');?></td> <td class='text-center'><?php echo $release->deleted ? $lang->weekly->deletedPlaceholder : $release->deviationDays;?></td> <td class='text-center' style="color:<?php echo $lang->weekly->releaseRiskSituationColor[$release->riskSituation];?>"><?php echo $release->deleted ? $lang->weekly->deletedPlaceholder : (is_numeric($release->riskSituation) ? sprintf($lang->weekly->releaseRiskSituation['delayed'], $release->riskSituation) : $lang->weekly->releaseRiskSituation[$release->riskSituation]);?></td> </tr> <?php endforeach;?>
06-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值