Skip to content

Commit

Permalink
Bug fix for GlobIterator extending service
Browse files Browse the repository at this point in the history
Reported by andrer on IRC... If a service extends GlobIterator, there
was a problem where we were checking if (!$instance) which would yield a
catchable fatal error that GlobIterator cannot be casted to a boolean.
To solve this, the comparison operators should be strict so PHP does not
try to convert the type internally. The types checked against are the
expected types if no services have been returned, so the overall
behavior should not be changed by this fix at all.
  • Loading branch information
EvanDotPro committed Feb 18, 2013
1 parent f07fafa commit d66fd64
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 3 deletions.
6 changes: 3 additions & 3 deletions library/Zend/ServiceManager/ServiceManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -445,7 +445,7 @@ public function get($name, $usePeeringServiceManagers = true)
}

// Still no instance? raise an exception
if (!$instance && !is_array($instance)) {
if ($instance === null && !is_array($instance)) {
if ($isAlias) {
throw new Exception\ServiceNotFoundException(sprintf(
'An alias "%s" was requested but no service could be found.',
Expand Down Expand Up @@ -494,11 +494,11 @@ public function create($name)
$instance = $this->createFromFactory($cName, $rName);
}

if (!$instance && isset($this->invokableClasses[$cName])) {
if ($instance === false && isset($this->invokableClasses[$cName])) {
$instance = $this->createFromInvokable($cName, $rName);
}

if (!$instance && $this->canCreateFromAbstractFactory($cName, $rName)) {
if ($instance === false && $this->canCreateFromAbstractFactory($cName, $rName)) {
$instance = $this->createFromAbstractFactory($cName, $rName);
}

Expand Down
12 changes: 12 additions & 0 deletions tests/ZendTest/ServiceManager/ServiceManagerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -560,6 +560,18 @@ public function testShouldRaiseExceptionIfInitializerClassIsNotAnInitializerInte
$result = $this->serviceManager->addInitializer(get_class($this));
}

public function testGetGlobIteratorServiceWorksProperly()
{
$config = new Config(array(
'invokables' => array(
'foo' => 'ZendTest\ServiceManager\TestAsset\GlobIteratorService',
),
));
$serviceManager = new ServiceManager($config);
$foo = $serviceManager->get('foo');
$this->assertInstanceOf('ZendTest\ServiceManager\TestAsset\GlobIteratorService', $foo);
}

public function duplicateService()
{
$self = $this;
Expand Down
19 changes: 19 additions & 0 deletions tests/ZendTest/ServiceManager/TestAsset/GlobIteratorService.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @package Zend_ServiceManager
*/

namespace ZendTest\ServiceManager\TestAsset;

class GlobIteratorService extends \GlobIterator
{
public function __construct()
{
}
}

0 comments on commit d66fd64

Please sign in to comment.