为什么get_class_methods()不显示特定PDO驱动程序的所有方法?

时间:2019-06-01 04:56:56

标签: php methods pdo reflection

我试图获取每个PDO驱动程序的所有方法(我的PC Windows上都安装了所有方法)。

但是,例如,如果我尝试使用Postgres(pdo_pgsql):

var_dump(get_class_methods($pdo));

结果是:

array(17) { [0]=> string(11) "__construct" [1]=> string(7) "prepare" [2]=> string(16) "beginTransaction" [3]=> string(6) "commit" [4]=> string(8) "rollBack" [5]=> string(13) "inTransaction" [6]=> string(12) "setAttribute" [7]=> string(4) "exec" [8]=> string(5) "query" [9]=> string(12) "lastInsertId" [10]=> string(9) "errorCode" [11]=> string(9) "errorInfo" [12]=> string(12) "getAttribute" [13]=> string(5) "quote" [14]=> string(8) "__wakeup" [15]=> string(7) "__sleep" [16]=> string(19) "getAvailableDrivers" } 

但是此列表不完整,因为PDO Postgres包含以下方法:

$pdo->pgsqlCopyToArray('my_table');

是否有一种方法可以获取所有方法,而不仅仅是PDO默认值?

预先感谢, 塞尔索(Celso)

修改

我也尝试过反射,结果像get_class_methods()一样不完整:

var_dump(array_column((new ReflectionClass($pdo))->getMethods(), 'name'));

结果:

array(17) { [0]=> string(11) "__construct" [1]=> string(7) "prepare" [2]=> string(16) "beginTransaction" [3]=> string(6) "commit" [4]=> string(8) "rollBack" [5]=> string(13) "inTransaction" [6]=> string(12) "setAttribute" [7]=> string(4) "exec" [8]=> string(5) "query" [9]=> string(12) "lastInsertId" [10]=> string(9) "errorCode" [11]=> string(9) "errorInfo" [12]=> string(12) "getAttribute" [13]=> string(5) "quote" [14]=> string(8) "__wakeup" [15]=> string(7) "__sleep" [16]=> string(19) "getAvailableDrivers" } 

1 个答案:

答案 0 :(得分:0)

首先,您必须了解根据PHP Docs声明的PDO:

  

简介      

PHP数据对象(PDO)扩展定义了轻量,一致的   用于访问PHP中的数据库的接口。每个数据库驱动程序   实现PDO接口可以将特定于数据库的功能公开为   常规扩展功能。请注意,您无法执行任何数据库   单独使用PDO扩展功能;您必须使用   特定于数据库的PDO驱动程序来访问数据库服务器。

     

PDO提供了数据访问抽象层,这意味着,   无论您使用哪个数据库,都使用相同的功能   发出查询并获取数据。 PDO不提供数据库   抽象它不会重写SQL或模拟缺少的功能。您   如果需要的话,应该使用完整的抽象层。

     

PDO随PHP 5.1一起提供,并且可以作为PHP的PECL扩展使用   5.0; PDO在PHP 5的核心中需要新的OO功能,因此不会在PHP的早期版本中运行。

它明确指出PDO是用于访问数据库的轻量级接口。再看一下这里提供的便笺

  

注意: ,您不能单独使用PDO扩展名执行任何数据库功能;您必须使用特定于数据库的PDO驱动程序   访问数据库服务器。

要更清楚地了解POD中有四件事,即

PDO接口PDO声明PDO异常PDO驱动程序

(适用于所有数据库)(适用于所有数据库)(适用于所有数据库)(适用于所有数据库)

get_class_methods仅列出 PDO 的方法,而不列出语句功能异常功能驱动程序的其他方法功能

现在认为PDO有四种不同的类:

PDO类PDO_Statement类PDO_Exections类PDO_Driver类

声明,异常和驱动程序在内部链接到PDO类

现在您正在get_class_methods上调用Class PDO,它将显示Class PDO的方法,如果您想知道PDO_Driver的所有方法,则必须调用正确的名称{ {1}}类。

现在PGSQL驱动程序的正确名称是什么,它是PHP的内部结构,为此您必须学习PHP的内部结构。