feature #13665 [Debug] generalize deprecated interfaces tracking (nicolas-grekas)
This PR was merged into the 2.7 branch.
Discussion
----------
[Debug] generalize deprecated interfaces tracking
| Q | A
| ------------- | ---
| Bug fix? | no
| New feature? | yes
| BC breaks? | no
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets | #13544
| License | MIT
| Doc PR | -
Commits
-------
a756f5b
[Debug] generalize deprecated interfaces tracking
This commit is contained in:
commit
74bdb8f902
@ -179,16 +179,19 @@ class DebugClassLoader
|
|||||||
|
|
||||||
if (preg_match('#\n \* @deprecated (.*?)\r?\n \*(?: @|/$)#s', $refl->getDocComment(), $notice)) {
|
if (preg_match('#\n \* @deprecated (.*?)\r?\n \*(?: @|/$)#s', $refl->getDocComment(), $notice)) {
|
||||||
self::$deprecated[$name] = preg_replace('#\s*\r?\n \* +#', ' ', $notice[1]);
|
self::$deprecated[$name] = preg_replace('#\s*\r?\n \* +#', ' ', $notice[1]);
|
||||||
} elseif (0 !== strpos($name, 'Symfony\\')) {
|
} else {
|
||||||
|
$len = 1 + (strpos($name, '\\', 1 + strpos($name, '\\')) ?: strpos($name, '_'));
|
||||||
$parent = $refl->getParentClass();
|
$parent = $refl->getParentClass();
|
||||||
|
|
||||||
if ($parent && isset(self::$deprecated[$parent->name])) {
|
if (!$parent || $len < 2 || strncmp($name, $parent, $len)) {
|
||||||
trigger_error(sprintf('The %s class extends %s that is deprecated %s', $name, $parent->name, self::$deprecated[$parent->name]), E_USER_DEPRECATED);
|
if ($parent && isset(self::$deprecated[$parent->name]) && ($len < 2 || strncmp($name, $parent->name, $len))) {
|
||||||
}
|
trigger_error(sprintf('The %s class extends %s that is deprecated %s', $name, $parent->name, self::$deprecated[$parent->name]), E_USER_DEPRECATED);
|
||||||
|
}
|
||||||
|
|
||||||
foreach ($refl->getInterfaceNames() as $interface) {
|
foreach ($refl->getInterfaceNames() as $interface) {
|
||||||
if (isset(self::$deprecated[$interface]) && !($parent && $parent->implementsInterface($interface))) {
|
if (isset(self::$deprecated[$interface]) && ($len < 2 || strncmp($name, $interface, $len)) && !($parent && $parent->implementsInterface($interface))) {
|
||||||
trigger_error(sprintf('The %s %s %s that is deprecated %s', $name, $refl->isInterface() ? 'interface extends' : 'class implements', $interface, self::$deprecated[$interface]), E_USER_DEPRECATED);
|
trigger_error(sprintf('The %s %s %s that is deprecated %s', $name, $refl->isInterface() ? 'interface extends' : 'class implements', $interface, self::$deprecated[$interface]), E_USER_DEPRECATED);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -186,6 +186,28 @@ class DebugClassLoaderTest extends \PHPUnit_Framework_TestCase
|
|||||||
array('DeprecatedParentClass', 'DeprecatedClass', 'extends'),
|
array('DeprecatedParentClass', 'DeprecatedClass', 'extends'),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testDeprecatedSuperInSameNamespace()
|
||||||
|
{
|
||||||
|
set_error_handler('var_dump', 0);
|
||||||
|
$e = error_reporting(0);
|
||||||
|
trigger_error('', E_USER_NOTICE);
|
||||||
|
|
||||||
|
class_exists(__NAMESPACE__.'\Fixtures\ExtendsDeprecatedParent', true);
|
||||||
|
|
||||||
|
error_reporting($e);
|
||||||
|
restore_error_handler();
|
||||||
|
|
||||||
|
$lastError = error_get_last();
|
||||||
|
unset($lastError['file'], $lastError['line']);
|
||||||
|
|
||||||
|
$xError = array(
|
||||||
|
'type' => E_USER_NOTICE,
|
||||||
|
'message' => '',
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertSame($xError, $lastError);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class ClassLoader
|
class ClassLoader
|
||||||
@ -217,6 +239,8 @@ class ClassLoader
|
|||||||
return __DIR__.'/Fixtures/notPsr0Bis.php';
|
return __DIR__.'/Fixtures/notPsr0Bis.php';
|
||||||
} elseif (__NAMESPACE__.'\Fixtures\DeprecatedInterface' === $class) {
|
} elseif (__NAMESPACE__.'\Fixtures\DeprecatedInterface' === $class) {
|
||||||
return __DIR__.'/Fixtures/DeprecatedInterface.php';
|
return __DIR__.'/Fixtures/DeprecatedInterface.php';
|
||||||
|
} elseif (__NAMESPACE__.'\Fixtures\ExtendsDeprecatedParent' === $class) {
|
||||||
|
eval('namespace '.__NAMESPACE__.'\Fixtures; class ExtendsDeprecatedParent extends DeprecatedClass {}');
|
||||||
} elseif ('Test\\'.__NAMESPACE__.'\DeprecatedParentClass' === $class) {
|
} elseif ('Test\\'.__NAMESPACE__.'\DeprecatedParentClass' === $class) {
|
||||||
eval('namespace Test\\'.__NAMESPACE__.'; class DeprecatedParentClass extends \\'.__NAMESPACE__.'\Fixtures\DeprecatedClass {}');
|
eval('namespace Test\\'.__NAMESPACE__.'; class DeprecatedParentClass extends \\'.__NAMESPACE__.'\Fixtures\DeprecatedClass {}');
|
||||||
} elseif ('Test\\'.__NAMESPACE__.'\DeprecatedInterfaceClass' === $class) {
|
} elseif ('Test\\'.__NAMESPACE__.'\DeprecatedInterfaceClass' === $class) {
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
"symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
|
"symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"symfony/class-loader": "~2.2",
|
"symfony/class-loader": "~2.2|~3.0.0",
|
||||||
"symfony/http-kernel": "~2.3.24|~2.5.9|~2.6,>=2.6.2|~3.0.0",
|
"symfony/http-kernel": "~2.3.24|~2.5.9|~2.6,>=2.6.2|~3.0.0",
|
||||||
"symfony/http-foundation": "~2.1|~3.0.0"
|
"symfony/http-foundation": "~2.1|~3.0.0"
|
||||||
},
|
},
|
||||||
|
Reference in New Issue
Block a user