You can achieve what you're trying to do already with a combination of
get_class() on a namespaced class and a simple regex (or other method of
processing a string to your liking):
$foo = "My\\Namespace\\Name\\Class";
var_dump(preg_match('/^(.*)\\\([^\\\]*)$/m',$foo,$matches),$matches);
array(3) {
[0] =>
string(23) "My\Namespace\Name\Class"
[1] =>
string(17) "My\Namespace\Name"
[2] =>
string(5) "Class"
}
Regards
David Gebler
On Thu, Feb 25, 2021 at 9:40 PM Manuel Canga <[email protected]> wrote:
> ---- En jue, 25 feb 2021 21:41:40 +0100 Nikita Popov <
> [email protected]> escribió ----
> > On Thu, Feb 25, 2021 at 8:11 PM Manuel Canga <[email protected]>
> wrote:
> >
> > > Hi internals,
> > >
> > > I would like to present a possible new RFC( "class_name:namespace" )
> for
> > > your consideration.
> > >
> > > As you know, namespaces are very important nowdays. They are used in
> > > autoloaders, Frameworks, CMS, ...
> > >
> > > Maybe, you are used to code something similar to this:
> > >
> > > ```
> > > use MyProject\MyHelpers\MyClass;
> > >
> > > echo substr( MyClass::class, 0, strrpos( MyClass::class, '\\'));
> > > ```
> > >
> > > or perhaps:
> > >
> > > ```
> > > use MyProject\MyHelpers\MyClass;
> > >
> > > $splited_class_name = explode( '\\', MyClass::class );
> > > array_pop($splited_class_name);
> > > echo $namespace = implode('\\', $splited_class_name );
> > > ```
> > >
> > > Other option is:
> > >
> > > ```
> > > namespace MyProject\MyHelpers;
> > >
> > > class MyClass {
> > > public const NAMESPACE = __NAMESPACE__;
> > > }
> > > ```
> > >
> > > However... :(
> > >
> > > ```
> > > namespace MyProject\MyServices;
> > >
> > > class MyNewClass extends MyClass{
> > > }
> > >
> > > echo MyNewClass::NAMESPACE; //MyProject\MyHelpers
> > > ```
> > >
> > > All of these examples are ways for getting a thing which PHP compiler
> > > would resolver fast.
> > >
> > > It would be fantastic can code:
> > >
> > > MyClass::namespace or static::namespace( for example, in abstract
> classes )
> > >
> > > Don't you think the same ?
> >
> >
> > Could you please share the use case(s) you have in mind for this?
> >
> > Regards,
> > Nikita
>
> Hi, Nikita,
>
> Yes, of course. For example, loading views using TemplateViews pattern[1]:
>
> ```
> namespace MyProjects\Framework;
>
> abstract class TemplateView {
> private const VIEW_SUBPATH = '/views/';
>
> protected function includeView( string $viewName ) {
> $filePath = str_replace('\\', '/', static::namespace ).
> self::VIEW_SUBPATH;
> $fileName =$filePath.$viewName.'.tpl';
>
> if( file_exists($fileName) ) {
> return include $fileName;
> }
>
> error_log("Not found view[$viewName] in path $filePath" };
> }
> }
> ```
>
> ```
> namespace MyProject\CMS\Freelancer\Attachments;
>
> class Budget extends TemplateView {
>
> public function __toString() {
> $this->includeView('full_budget');
> }
>
> }```
>
>
>
> Regards
> - P.S: Sorry, my mistake with subject.
>
> [1]:
> https://dzone.com/articles/practical-php-patterns/practical-php-patterns-9
> --
> Manuel Canga
>
> Zend Certified PHP Engineer
> Websites: https://manuelcanga.dev | https://trasweb.net
> Linkedin: https://es.linkedin.com/in/manuelcanga
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: https://www.php.net/unsub.php
>
>