1

I ran into an issue with parent/child classes in different namespaces that I'm wondering if it's my improper use, or if this is a quirk of PHP namespaces:

<?php
namespace myVendorName;
class MyParentClass {
  protected $args = array();
  function factory($class) {
    return new $class($this->args);
  }
}
?>

<?php
namespace myVendorName\subPackage;
class foo {
}
class bar extends \myVendorName\MyParentClass {
  function myFunc() {
    var_dump(new foo()); // Works (we're in the same namespace)
    var_dump($this->factory('foo')); // Doesn't work (no such class as myVendorName\foo)
    var_dump($this->factory('subPackage\foo')); // Works
  }
}
?>

The above code doesn't work as I'd expect. In the \myVendorName\subPackage\bar->myFunc() method, I'd like to get a \myVendorName\subPackage\foo class. If I just create it there, I can create it by only its class name since the namespace is the same. However, those classes in reality are more complex, and there's a factory method to create them. The factory method is universal, and is defined in the root vendor namespace. And the bar class doesn't overwrite that factory method; it simply inherits it. However, when referring to a class object by name, it seems to still operate in the parent's namespace, rather than having the method truly get inherited by the child and operate in the child's namespace.

Is there a way for a parent class method that's going to be inherited directly to use the child's namespace, or at least peek at what it is? Or does each of my child classes have to overwrite the factory method to fix the namespace, and call the parent method within themselves?

1
  • 1
    There's is a comment in PHP document that you might want to check out... Commented Sep 13, 2012 at 5:47

1 Answer 1

1

The answer, as Passerby indicated is that PHP does have a __NAMESPACE__ constant that is filled with the current namespace (though no leading slash). So modifying the factory function to:

function factory($class) {
  if ($class[0] != '\\') {
    $class = '\\'.__NAMESPACE__.$class; // If not a fully-qualified classname, prepend namespace
  }
  return new $class($args);
}

works as expected (there's an example of this in the PHP documentation)

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.