Skip to content

Commit 500a6b6

Browse files
committed
bug #13768 [Debug] Deprecations exception for Symfony internals (nicolas-grekas)
This PR was merged into the 2.7 branch. Discussion ---------- [Debug] Deprecations exception for Symfony internals | Q | A | ------------- | --- | Bug fix? | yes | New feature? | no | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | #13764 | License | MIT | Doc PR | - Allowing 1st level check of the `Symfony\` namespace prevents trigerring deprecation notices for internal things, but keeps notices enabled for `Symfony\Cmf\` classes Commits ------- 323e957 [Debug] Deprecations exception for Symfony internals
2 parents b6148e2 + 323e957 commit 500a6b6

File tree

2 files changed

+19
-7
lines changed

2 files changed

+19
-7
lines changed

src/Symfony/Component/Debug/DebugClassLoader.php

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -180,16 +180,28 @@ public function loadClass($class)
180180
if (preg_match('#\n \* @deprecated (.*?)\r?\n \*(?: @|/$)#s', $refl->getDocComment(), $notice)) {
181181
self::$deprecated[$name] = preg_replace('#\s*\r?\n \* +#', ' ', $notice[1]);
182182
} else {
183-
$len = 1 + (strpos($name, '\\', 1 + strpos($name, '\\')) ?: strpos($name, '_'));
183+
if (2 > $len = 1 + (strpos($name, '\\', 1 + strpos($name, '\\')) ?: strpos($name, '_'))) {
184+
$len = 0;
185+
$ns = '';
186+
} else {
187+
switch ($ns = substr($name, 0, $len)) {
188+
case 'Symfony\Bridge\\':
189+
case 'Symfony\Bundle\\':
190+
case 'Symfony\Component\\':
191+
$ns = 'Symfony\\';
192+
$len = strlen($ns);
193+
break;
194+
}
195+
}
184196
$parent = $refl->getParentClass();
185197

186-
if (!$parent || $len < 2 || strncmp($name, $parent, $len)) {
187-
if ($parent && isset(self::$deprecated[$parent->name]) && ($len < 2 || strncmp($name, $parent->name, $len))) {
198+
if (!$parent || strncmp($ns, $parent, $len)) {
199+
if ($parent && isset(self::$deprecated[$parent->name]) && strncmp($ns, $parent->name, $len)) {
188200
trigger_error(sprintf('The %s class extends %s that is deprecated %s', $name, $parent->name, self::$deprecated[$parent->name]), E_USER_DEPRECATED);
189201
}
190202

191203
foreach ($refl->getInterfaceNames() as $interface) {
192-
if (isset(self::$deprecated[$interface]) && ($len < 2 || strncmp($name, $interface, $len)) && !($parent && $parent->implementsInterface($interface))) {
204+
if (isset(self::$deprecated[$interface]) && strncmp($ns, $interface, $len) && !($parent && $parent->implementsInterface($interface))) {
193205
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);
194206
}
195207
}

src/Symfony/Component/Debug/Tests/DebugClassLoaderTest.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ public function testDeprecatedSuperInSameNamespace()
193193
$e = error_reporting(0);
194194
trigger_error('', E_USER_NOTICE);
195195

196-
class_exists(__NAMESPACE__.'\Fixtures\ExtendsDeprecatedParent', true);
196+
class_exists('Symfony\Bridge\Debug\Tests\Fixtures\ExtendsDeprecatedParent', true);
197197

198198
error_reporting($e);
199199
restore_error_handler();
@@ -239,8 +239,8 @@ public function findFile($class)
239239
return __DIR__.'/Fixtures/notPsr0Bis.php';
240240
} elseif (__NAMESPACE__.'\Fixtures\DeprecatedInterface' === $class) {
241241
return __DIR__.'/Fixtures/DeprecatedInterface.php';
242-
} elseif (__NAMESPACE__.'\Fixtures\ExtendsDeprecatedParent' === $class) {
243-
eval('namespace '.__NAMESPACE__.'\Fixtures; class ExtendsDeprecatedParent extends DeprecatedClass {}');
242+
} elseif ('Symfony\Bridge\Debug\Tests\Fixtures\ExtendsDeprecatedParent' === $class) {
243+
eval('namespace Symfony\Bridge\Debug\Tests\Fixtures; class ExtendsDeprecatedParent extends \\'.__NAMESPACE__.'\Fixtures\DeprecatedClass {}');
244244
} elseif ('Test\\'.__NAMESPACE__.'\DeprecatedParentClass' === $class) {
245245
eval('namespace Test\\'.__NAMESPACE__.'; class DeprecatedParentClass extends \\'.__NAMESPACE__.'\Fixtures\DeprecatedClass {}');
246246
} elseif ('Test\\'.__NAMESPACE__.'\DeprecatedInterfaceClass' === $class) {

0 commit comments

Comments
 (0)