Skip to content

fix: support PDOStatement subclasses in PdoStatementExecuteMethodRule#773

Open
vaielab wants to merge 2 commits intostaabm:mainfrom
vaielab:fix/pdo-statement-subclass-execute
Open

fix: support PDOStatement subclasses in PdoStatementExecuteMethodRule#773
vaielab wants to merge 2 commits intostaabm:mainfrom
vaielab:fix/pdo-statement-subclass-execute

Conversation

@vaielab
Copy link
Copy Markdown

@vaielab vaielab commented Apr 12, 2026

Hello, me again! Here is another problem I found while using your extension. Hope this helps.

Problem

PdoStatementExecuteMethodRule was skipping analysis when execute() is called on a subclass of PDOStatement that overrides the method. This is because the rule checked whether execute() was declared in PDOStatement:

if (PDOStatement::class !== $methodReflection->getDeclaringClass()->getName()) {
  return [];
}

When a subclass overrides execute(), the declaring class is the subclass and not PDOStatement, so the rule bailed out early, silently missing placeholder errors.

Fix

Replace the declaring-class check with a type check on the call's receiver:

if (!(new \PHPStan\Type\ObjectType(PDOStatement::class))->isSuperTypeOf($scope->getType($methodCall->var))->yes()) {
  return []; 
}

This correctly handles PDOStatement itself and any subclass, regardless ofwhether execute() is inherited or overridden.

Tests

  • Added MyPdoStatement fixture (extends PDOStatement, overrides execute())
  • Added pdo-stmt-execute-subclassed.php test data with both error and no-error cases
  • Added testSubclassedPdoStatement() to PdoStatementExecuteMethodRuleTest

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant