方人胥 2021-06-12 20:10 采纳率: 100%
浏览 23
已采纳

PHP跨类调用后,找不到方法

做静态方法重载实现数据库的链式访问的练习

demo5.php引用了Query.php的类

然后访问Query中的方法,页面提示我方法 'table' 在 Database 中未找到

以下是源代码,希望可以帮我检查出错误

第一个是Query.php

<?php
 
//常用的数据查询操作
 
class Query
 
{
 
    //连接对象
 
    public $pdo = null;
 
 
 
    //数据表名称
 
    public $table = '';
 
 
 
    //字段列表
 
    public $field = '';
 
 
 
    //查询条件
 
    public $where = '';
 
 
 
    //显示数量
 
    public $limit = 0;
 
 
 
 
 
    //构造方法
 
    public function __construct(PDO $pdo)
 
    {
 
        $this->pdo = $pdo;
 
    }
 
 
 
    //调用表名
 
    public function table($tableName)
 
    {
 
        $this->table = $tableName;
 
        //关键是这一步
 
        return $this;
 
    }
 
 
 
    //调用字段
 
    public function field($fields)
 
    {
 
        $this->field = $fields;
 
        //关键是这一步
 
        return $this;
 
    }
 
 
 
    //设置查询条件
 
    public function where($where)
 
    {
 
        $this->where = $where;
 
        return $this;
 
    }
 
    //设置显示数量
 
    public function limit($limit)
 
    {
 
        $this->limit = $limit;
 
        return $this;
 
    }
 
 
 
    //创建SQL语句查询
 
    public function select()
 
    {
 
        //设置查询条件
 
        $fields = empty($this->field) ? '*' : $this->field;
 
        $where = empty($this->where) ? '' : ' WHERE ' . $this->where;
 
        $limit = empty($this->limit) ? '' : ' LIMIT ' . $this->limit;
 
 
 
        //SQL
 
        $sql = 'SELECT '.$fields. 'FROM' .$this->table. $where . $limit;
 
 
 
        //预处理执行
 
        $stmt = $this->pdo->prepare($sql);
 
        $stmt->execute();
 
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
 
    }
 
}

第二个是demo5.php

<?php
 
//方法重载实例演示
 
require 'Query.php';
 
class Database
 
{
 
    //数据库连接对象
 
    protected static $pdo = null;
 
 
 
    //数据库连接方法,每次查询时再连接,实现真正的惰性连接,节省系统开销
 
    public static function connection()
 
    {
 
        self::$pdo = new PDO('mysql:host=127.0.0.1;dbname=php','root','admin');
 
    }
 
 
 
    //静态方法的重载,实现跨类调用
 
    public static function __callStatic($name,$arguments)
 
    {
 
        //连接上数据库
 
        self::connection();
 
 
 
        //实例化查询类
 
        $query = new Query(self::$pdo);
 
 
 
        //访问Query中的方法
 
        return call_user_func_array([$query, $name],[$arguments[0]]);
 
    }
 
 
 
 
 
}
 
 
 
$cats = Database::table('category')
 
    ->field('cate_id, name, alias')
 
    ->where('cate_id>=2')
 
    ->select();
 
 
 
foreach($cats as $cat){
 
    print_r($cat);
 
}

页面提示方法 'table' 在 Database 中未找到

image.png

  • 写回答

3条回答 默认 最新

  • 关注

    把SQL语句打印出来看看,是不是表名写错了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵