【问题标题】:Get class name minus namespace without using Reflection在不使用反射的情况下获取类名减去命名空间
【发布时间】:2018-08-27 18:05:40
【问题描述】:

有没有一种简单的方法可以在没有命名空间without使用反射的情况下获取类名?

这是我的课,当我打电话给get_class() 时,我得到CRMPiccoBundle\Services\RFC\Webhook\SiteCancelled

namespace CRMPiccoBundle\Services\RFC\Webhook;

class SiteCancelled extends Base implements Interface
{
    public function process() {
       // echo get_class()
    }
}

【问题讨论】:

  • 有什么特殊的原因你不想要反射吗?除此之外,如果你有类名作为字符串,你可以在它上面使用 PHP 的字符串函数。
  • 用类名创建类属性并使用它))))
  • 替换 getclass 中的__NAMESPACE____?
  • 找到最后一次出现的\ 并取其后的所有内容……php.net/manual/en/ref.strings.php
  • 我看到了使用str_replace 的 cmets 和答案,但我完全希望 PHP 能够提供一种更简洁的方式来做到这一点,而不必依赖字符串操作。

标签: php class oop reflection php-7


【解决方案1】:

使用字符串操作的方法有很多……

如果您确定您的类名包含命名空间:

$c = 'CRMPiccoBundle\Services\RFC\Webhook';

echo ltrim(strrchr($c, '\\'), '\\');
echo substr($c, strrpos($c, '\\') + 1);

如果您不确定该类是否包含命名空间:

echo ltrim(substr($c, strrpos($c, '\\')), '\\');

preg_match('/[^\\\\]+$/', $c, $m)
echo $m[0];

可能还有关于该主题的许多其他变体……

【讨论】:

    【解决方案2】:

    或者简单地从class_name 爆炸返回并获取最后一个元素:

     $class_parts = explode('\\', get_class());
     echo end($class_parts);
    

    或者只是从get_class的输出中删除命名空间:

    echo str_replace(__NAMESPACE__ . '\\', '', get_class());
    

    使用或不使用命名空间均可。

    等等。

    【讨论】:

    • 不能在不声明变量的情况下使用end。是否有替代方法来获取最后一个元素?
    【解决方案3】:

    使用class_basename() 函数获取没有命名空间的类名

    <?php
    
    echo class_basename(__CLASS__);
    

    【讨论】:

    • class_basename() 函数不存在。
    • class_basenamefunction from Laravel,不是来自 PHP 本身。
    • 好吧,我正在使用 Laravel,我正在寻找这个。感恩@LucaMurante :-)
    【解决方案4】:

    这是我想出的最快的方法,似乎适用于所有情况:

    function toUqcn(string $fqcn) {
       return substr($fqcn, (strrpos($fqcn, '\\') ?: -1) + 1);
    }
    

    【讨论】:

      猜你喜欢
      • 2011-08-12
      • 2014-09-08
      • 2018-10-11
      • 1970-01-01
      • 2010-09-09
      • 1970-01-01
      • 2011-03-18
      • 2018-09-13
      • 1970-01-01
      相关资源
      最近更新 更多