Mariastan是Mariadb查询的静态分析工具。它的主要目的是作为Phpstan扩展的基础。
当前状态(24。04。2024):
Mariastan非常不完整。它可能覆盖我使用的大型代码库中约90%的用例(数百个表,数千个查询)。结果,没有太多活动。但这是从某种意义上积极维护的,如果某件事对我来说可能会得到解决。
如果您尝试在项目中使用它,则可能会遇到未实现的用例(例如,我的项目不使用的语法/函数)。如果发生这种情况,您应该准备自己修理问题(大多数事情应该很容易)。
任何事情都没有向后兼容的承诺,也没有发布 - 我只是使用主人。
Mariastan通过Mariadb 10.11和Php 8.1-8.3进行了测试。
使用composer require --dev schlndh/maria-stan:dev-master 。然后,您需要将以下内容添加到您的phpstan.neon :
includes :
- ./vendor/schlndh/maria-stan/extension.neon
Mariastan需要访问数据库模式。提供它的最简单方法是让其直接连接到数据库。您需要将以下配置添加到phpstan.neon并设置适当的凭据:
parameters :
maria-stan :
db :
# Change these to match your database
host : 127.0.0.1
port : 3306
user : ' root '
password : ' '
database : ' db 'Mariastan需要访问数据库来获取架构以进行查询分析。它只读取表格架,没有写任何东西。但是,不要让它访问任何包含任何重要数据的数据库。
另外,也可以在分析过程中使用Mariastan而无需访问数据库。在这种情况下,您需要首先使用MariaDbFileDbReflection::dumpSchema将模式转储,然后将其保存到文件中。这是一个执行此操作的示例脚本:
<?php
declare (strict_types= 1 );
use MariaStan DbReflection MariaDbFileDbReflection ;
require_once __DIR__ . ' /vendor/autoload.php ' ;
$ mysqli = new mysqli ( ' 127.0.0.1 ' , ' root ' , '' );
file_put_contents ( __DIR__ . ' /maria-stan-schema.dump ' , MariaDbFileDbReflection:: dumpSchema ( $ mysqli , ' database ' ));然后将以下内容添加到您的phpstan.neon :
parameters :
maria-stan :
reflection :
file : %rootDir%/../../../maria-stan-schema.dump
services :
mariaDbReflection : @ mariaDbFileDbReflection请注意,相对路径的自动扩展仅适用于PHPSTAN自己的配置(即这是配置键的硬编码列表)。因此,您必须为转储文件提供绝对的路径。
有关参数的完整列表,请参见extension.neon 。
Mariastan包括Mysqli的样本Phpstan扩展名。但是,此扩展的目的仅仅是为了验证与phpstan的集成。我不希望任何人实际使用mysqli。因此,期望您编写与Mariastan集成的phpstan扩展名。如果您想使用mysqli扩展名,请包括./vendor/schlndh/maria-stan/extension.mysqli.neon在您的phpstan.neon中。
您可以将MySQLI扩展名作为起点A修改以符合您的需求。基本想法是从PHPSTAN获取查询字符串,将其传递给Mariastan进行分析,然后将结果类型和错误报告回PHPSTAN。
在开始实施自己的扩展程序以将Mariastan集成到您的项目中之前,您可以快速尝试一下。您可以首先检查一个使用MySQLI扩展名的简单示例。然后,您可以尝试通过Mysqli从代码库调查查询,并使用MySQLI扩展名进行分析,以确保Mariastan支持您的项目使用的功能。
以下是您可以根据Mariastan在自己的phpstan扩展中实现的功能列表(其中大多数应在Mysqli扩展中进行演示):
mysqli_result::fetch_fields )推断出更狭窄的类型。这是因为Mariastan可以(在简单的情况下)理解查询,例如SELECT col FROM tbl WHERE col IS NOT NULL并从结果类型中删除NULL ,而Mariadb似乎没有这样做。INSERT / REPLACE中强制列的数据SELECT COUNT(*) FROM tbl ),该行可用于缩小mysqli_result::fetch_all (即non-empty-array )之类的方法的返回类型。 function foo ( mysqli $ db , int $ count ) {
return $ db -> prepare ( " SELECT * FROM tbl WHERE id IN ( " . implode ( ' , ' , array_fill ( 0 , $ count , ' ? ' )) . ' ) ' );
}据我所知,PHPSTAN-DBA通过执行查询来获取有关结果类型,错误,... Mariastan的信息通过静态分析查询。 phpstan-dba的好处包括:
Phpstan-DBA的方法有一些小小的缺点:
information_schema获取数据,不一定在分析时间)。但是可以实现CREATE TABLE (等)解析并在此基础上实现数据库反射。SELECT查询的条件以及交易的使用。因此,我不确定它如何支持INSERT等。(至少有一些测试)。