Skip to content

Commit

Permalink
Fixed erroneous deprecation notice for extended Interfaces
Browse files Browse the repository at this point in the history
  • Loading branch information
peterrehm committed Jan 11, 2016
1 parent 8956ed5 commit 5f4e968
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 1 deletion.
19 changes: 18 additions & 1 deletion src/Symfony/Component/Debug/DebugClassLoader.php
Expand Up @@ -200,8 +200,25 @@ public function loadClass($class)
@trigger_error(sprintf('The %s class extends %s that is deprecated %s', $name, $parent->name, self::$deprecated[$parent->name]), E_USER_DEPRECATED);
}

$parentInterfaces = array();
$deprecatedInterfaces = array();
if ($parent) {
foreach ($parent->getInterfaceNames() as $interface) {
$parentInterfaces[$interface] = 1;
}
}

foreach ($refl->getInterfaceNames() as $interface) {
if (isset(self::$deprecated[$interface]) && strncmp($ns, $interface, $len) && !($parent && $parent->implementsInterface($interface))) {
if (isset(self::$deprecated[$interface]) && strncmp($ns, $interface, $len)) {
$deprecatedInterfaces[] = $interface;
}
foreach (class_implements($interface) as $interface) {
$parentInterfaces[$interface] = 1;
}
}

foreach ($deprecatedInterfaces as $interface) {
if (!isset($parentInterfaces[$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);
}
}
Expand Down
24 changes: 24 additions & 0 deletions src/Symfony/Component/Debug/Tests/DebugClassLoaderTest.php
Expand Up @@ -203,6 +203,28 @@ public function provideDeprecatedSuper()
);
}

public function testInterfaceExtendsDeprecatedInterface()
{
set_error_handler('var_dump', 0);
$e = error_reporting(0);
trigger_error('', E_USER_NOTICE);

class_exists('Test\\'.__NAMESPACE__.'\\NonDeprecatedInterfaceClass', 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);
}

public function testDeprecatedSuperInSameNamespace()
{
set_error_handler('var_dump', 0);
Expand Down Expand Up @@ -289,6 +311,8 @@ public function findFile($class)
eval('namespace Test\\'.__NAMESPACE__.'; class DeprecatedParentClass extends \\'.__NAMESPACE__.'\Fixtures\DeprecatedClass {}');
} elseif ('Test\\'.__NAMESPACE__.'\DeprecatedInterfaceClass' === $class) {
eval('namespace Test\\'.__NAMESPACE__.'; class DeprecatedInterfaceClass implements \\'.__NAMESPACE__.'\Fixtures\DeprecatedInterface {}');
} elseif ('Test\\'.__NAMESPACE__.'\NonDeprecatedInterfaceClass' === $class) {
eval('namespace Test\\'.__NAMESPACE__.'; class NonDeprecatedInterfaceClass implements \\'.__NAMESPACE__.'\Fixtures\NonDeprecatedInterface {}');
} elseif ('Test\\'.__NAMESPACE__.'\Float' === $class) {
eval('namespace Test\\'.__NAMESPACE__.'; class Float {}');
}
Expand Down
@@ -0,0 +1,7 @@
<?php

namespace Symfony\Component\Debug\Tests\Fixtures;

interface NonDeprecatedInterface extends DeprecatedInterface
{
}

0 comments on commit 5f4e968

Please sign in to comment.