方人胥 发表于 2021-6-12 20:07

PHP编程学习,跨类调用后,找不到方法

本帖最后由 方人胥 于 2021-6-18 17:49 编辑

做静态方法重载实现数据库的链式访问的练习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]);

    }





}



$cats = Database::table('category')

    ->field('cate_id, name, alias')

    ->where('cate_id>=2')

    ->select();



foreach($cats as $cat){

    print_r($cat);

}

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

方人胥 发表于 2021-6-12 21:10

找到问题了,是Query.php的第65行,做拼接的时候,忘了FROM前后应该加上空格。

tjf 发表于 2021-6-13 09:06

方人胥 发表于 2021-6-12 21:10
找到问题了,是Query.php的第65行,做拼接的时候,忘了FROM前后应该加上空格。

{:301_999:}厉害厉害

方人胥 发表于 2021-6-13 11:02

tjf 发表于 2021-6-13 09:06
厉害厉害

我找了好久,最后把SQL语句打印出来的时候,才发现不对

tjf 发表于 2021-6-13 11:52

方人胥 发表于 2021-6-13 11:02
我找了好久,最后把SQL语句打印出来的时候,才发现不对

加油加油{:301_1003:}
页: [1]
查看完整版本: PHP编程学习,跨类调用后,找不到方法