我有一个类Database.php,它是一个抽象的Singleton类:

abstract class Database

{

protected static $_instance;

...

public static function instance()

{

$class = get_called_class();

if (!self::$_instance) {

self::$_instance = new $class();

}

return self::$_instance;

}

}

?>其他数据库扩展了这个类并实现了抽象函数,这样我就可以更改我使用的数据库,同时确保我的应用程序在它使用抽象层中的函数时仍然有效(我已经省略了上面的函数定义码)。

我在PDO.php中有一个PDO类。它扩展了数据库,并且还包含与上面的instance()函数相同的函数,但它没有它自己的$_instance变量。

class PDO extends Database

{

//...

public static function instance()

{

$class = get_called_class();

if (!self::$_instance) {

self::$_instance = new $class();

}

return self::$_instance;

}

}最初我以为我不需要在PDO类中包含instance()函数,因为它从数据库继承而来。但是我收到它是因为我收到这个错误:

Fatal error: Call to undefined method PDO::instance()

问题是,即使使用上面的代码,我仍然遇到此错误。我不知道这是否是相关的,但我得到了另一个奇怪的错误。我想要使​​用的数据库类型(在本例中为PDO)存储在可通过App::setting('DB')访问的变量中。我的MVC框架中的Model基类加载适当的数据库类并将其存储在$this->_db中。这里是模型的代码:

require_once 'Databases/Database.php';

class Model

{

protected $_db;

public function __construct()

{

$database = App::setting('DB'); // 'PDO'

require_once 'Databases/' . $database . '.php';

$this->_db = $database::instance(); // this is what triggers the error

}

}

?>现在这段代码给了我一个错误,我无法重新声明PDO类。我在网上搜索,发现问题通常与使用include()而不是require_once()有关。我到处检查了自己的自动加载器,没有看到任何include()。即使在上述模型中使用了require_once(),它仍然给我提供了错误(这是我唯一需要PDO类的地方......)。

为了解决这个错误,我使用了一个创可贴解决方案,我用Model构造函数替换了需求:

if (!class_exists($database)) {

require_once 'Databases/' . $database . '.php';

}任何人都可以解释这里发生了什么?

PHP未定义名称的方法,PHP:“调用未定义的方法”......但方法是否已定义?相关推荐

  1. c 的dll php调用方法,PHP调用C#开发的dll类库方法,_PHP教程

    PHP调用C#开发的dll类库方法, 有的时候,我们需要在php中利用到其他语言编写的dll类库,如C#编写的dll,方法就是利用PHP new COM方法来调用,在调用之前先要把dll库注册并把程序 ...

  2. java方法的调用怎么跳出_JAVA 的一个方法调用另一个方法时,怎么把那个方法里的数据调用出来...

    例如:此例子中Calcute()方法调用dispMax()方法时,怎么把curCost的数据调用到publicListgetBidListByName1(Stringname)中来,,,谢谢大家来帮忙 ...

  3. Spring JDBC-事务方法嵌套调用解读

    Spring事务传播机制回顾 相互嵌套的服务方法 源码 Spring事务传播机制回顾 关于Spring事务的一个错误的说法:一个事务方法中不应该调用另外一个事务方法,否则将产生两个事务,其实这是不正确 ...

  4. Java方法的调用以及参数传递

    一.方法的调用及参数的传递 1.方法的调用 1.1 定义方法的语法 [访问修饰符] 返回值类型 方法名([参数类型 参数1,参数类型 参数2,-]){ ​ 方法体 } 详解: 访问修饰符:用于修饰这个 ...

  5. Java方法完整调用链生成工具

    1. 前言 在很多场景下,如果能够生成Java代码中方法之间的调用链,是很有帮助的,例如分析代码执行流程.确认被修改代码的影响范围.代码审计/漏洞分析等. IDEA提供了显示调用指定Java方法向上的 ...

  6. 虚方法的调用是怎么实现的(单继承VS多继承)

    我们知道通过一个指向之类的父类指针可以调用子类的虚方法,因为子类的方法会覆盖父类同样的方法,通过这个指针可以找到对象实例的地址,通过实例的地址可以找到指向对应方法表的指针,而通过这个方法的名字就可以确 ...

  7. Spring事务管理嵌套事务详解 : 同一个类中,一个方法调用另外一个有事务的方法

    Spring 事务机制回顾 Spring事务一个被讹传很广说法是:一个事务方法不应该调用另一个事务方法,否则将产生两个事务.  结果造成开发人员在设计事务方法时束手束脚,生怕一不小心就踩到地雷.    ...

  8. Spirng的事务 方法A调用方法B,事务是否失效

    总结: 方法A调用方法B: 如果A和B方法在同一个类中: 如果A加@Transactional注解,B加不加@Transactional注解,事务是有效的,则AB在同一事务中. 如果A不加@Trans ...

  9. 就同一个Service类中,一个事务方法调用另外一个有事务的方法

    目录 一.Spring 事务机制 二.Spring事务传播行为 三.场景总结 1.在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational)的方法,注解是不会生效的 2. ...

  10. aop 获取注解注释的方法_带有AOP和注释的Java方法记录

    aop 获取注解注释的方法 有时,我想记录(通过slf4j和log4j )方法的每次执行,查看其接收的参数,返回的内容以及每次执行花费的时间. 这是我在AspectJ , jcabi-aspects和 ...

最新文章

  1. plaxis 2d 2020中文版
  2. JMeter入门教程(自己做测试了)
  3. 批量上传插件(flash,html5,jquery)
  4. linux代码、数据库备份
  5. c#问题(按F1或F2键时触发事件)
  6. Flume监听文件夹中的文件变化_并把文件下沉到hdfs
  7. 【java笔记】常用接口(2):Consumer接口
  8. loss低但精确度低_目标检测中的Loss改进:GIOU
  9. 【USACO 2.2】Subset Sums (DP)
  10. 图像修复经典算法--Criminisi算法
  11. 2个dataframe,df1的每一列分别乘以df2的某一列
  12. 利用单片机做手机连点器(附别踩白块自动点击程序)
  13. vue去除input在360兼容模式下删除图标
  14. python fork()创建新的进程,daemon进程
  15. 【Python办公自动化】使用reportlab制作pdf报告
  16. 有趣的深度学习——使用TensorFlow 2.0 + RNN 实现一个古体诗生成器
  17. OpenCV实战——拟合直线
  18. phpMyAdmin 常见漏洞利用记录
  19. 计算机题库一级第四,计算机一级题题库,第四章Excel
  20. Vue-vben-admin Vue3+TS Axios的封装源码分析

热门文章

  1. 回归!这里才是我们的天堂
  2. 确定多重选择列表控件 (List Control) 中的选定内容
  3. 黑马程序员Linux系统开发视频之产生信号的方法
  4. 高性能计算战火再度升级,科技综合实力竞争少不了它
  5. An Introduction To The SQLite C/C++ Interface
  6. matlab计算运行时间方法
  7. java和php设置的cookies_php带cookie访问下载文件 header设置
  8. 如何保证RabbitMQ消息队列的高可用?
  9. @override注解可以不写吗
  10. pcss评分_GTA5画质设置 N卡画质选项设置指南