Skip to content
Browse files

Bug fix for GlobIterator extending service

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...
1 parent f07fafa commit d66fd64cdc6a6e3cdb2cd78bbb45d8777f7570dc @EvanDotPro committed
View
6 library/Zend/ServiceManager/ServiceManager.php
@@ -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.',
@@ -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);
}
View
12 tests/ZendTest/ServiceManager/ServiceManagerTest.php
@@ -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;
View
19 tests/ZendTest/ServiceManager/TestAsset/GlobIteratorService.php
@@ -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.
Something went wrong with that request. Please try again.