Hướng dẫn php get class name without namespace laravel - php lấy tên lớp mà không có không gian tên laravel

Bạn có thể làm điều này với sự phản ánh. Cụ thể, bạn có thể sử dụng phương thức

$classNameWithNamespace=get_class($this);
return substr($classNameWithNamespace, strrpos($classNameWithNamespace, '\\')+1);
8, có tên của lớp mà không có không gian tên của nó.

Đầu tiên, bạn cần xây dựng một thể hiện

$classNameWithNamespace=get_class($this);
return substr($classNameWithNamespace, strrpos($classNameWithNamespace, '\\')+1);
9 và sau đó gọi phương thức
Reflection: 0.068084406852722 s ClassA
Basename: 0.12301609516144 s ClassA
Explode: 0.14073524475098 s ClassA
Substring: 0.059865570068359 s ClassA 
0 của trường hợp đó:

$reflect = new ReflectionClass($object);
if ($reflect->getShortName() === 'Name') {
    // do this
}

Tuy nhiên, tôi không thể tưởng tượng được nhiều trường hợp mà điều này sẽ là mong muốn. Nếu bạn muốn yêu cầu rằng đối tượng là thành viên của một lớp nhất định, thì cách để kiểm tra nó là với

Reflection: 0.068084406852722 s ClassA
Basename: 0.12301609516144 s ClassA
Explode: 0.14073524475098 s ClassA
Substring: 0.059865570068359 s ClassA 
1. Nếu bạn muốn một cách linh hoạt hơn để báo hiệu các ràng buộc nhất định, cách để làm điều đó là viết một giao diện và yêu cầu mã thực hiện giao diện đó. Một lần nữa, cách chính xác để làm điều này là với
Reflection: 0.068084406852722 s ClassA
Basename: 0.12301609516144 s ClassA
Explode: 0.14073524475098 s ClassA
Substring: 0.059865570068359 s ClassA 
1. (Bạn có thể làm điều đó với
$classNameWithNamespace=get_class($this);
return substr($classNameWithNamespace, strrpos($classNameWithNamespace, '\\')+1);
9, nhưng nó sẽ có hiệu suất tồi tệ hơn nhiều.)

Hướng dẫn php get class name without namespace laravel - php lấy tên lớp mà không có không gian tên laravel

Đã trả lời ngày 11 tháng 11 năm 2013 lúc 15:09Nov 11, 2013 at 15:09

Lonesomedaylonesomedaylonesomeday

228K49 Huy hiệu vàng312 Huy hiệu bạc314 Huy hiệu đồng49 gold badges312 silver badges314 bronze badges

17

Reflection: 0.068084406852722 s ClassA
Basename: 0.12301609516144 s ClassA
Explode: 0.14073524475098 s ClassA
Substring: 0.059865570068359 s ClassA 
4 là giải pháp tốt nhất liên quan đến hiệu suất.

Tôi đã tò mò những giải pháp được cung cấp là nhanh nhất, vì vậy tôi đã kết hợp một bài kiểm tra nhỏ.

Kết quả

Reflection: 1.967512512207 s ClassA
Basename:   2.6840535163879 s ClassA
Explode:    2.6507515668869 s ClassA

Mã số

namespace foo\bar\baz;

class ClassA{
    public function getClassExplode(){
        return explode('\\', static::class)[0];
    }

    public function getClassReflection(){
        return (new \ReflectionClass($this))->getShortName();
    }

    public function getClassBasename(){
        return basename(str_replace('\\', '/', static::class));
    }
}

$a = new ClassA();
$num = 100000;

$rounds = 10;
$res = array(
    "Reflection" => array(),
    "Basename" => array(),
    "Explode" => array(),
);

for($r = 0; $r < $rounds; $r++){

    $start = microtime(true);
    for($i = 0; $i < $num; $i++){
        $a->getClassReflection();
    }
    $end = microtime(true);
    $res["Reflection"][] = ($end-$start);

    $start = microtime(true);
    for($i = 0; $i < $num; $i++){
        $a->getClassBasename();
    }
    $end = microtime(true);
    $res["Basename"][] = ($end-$start);

    $start = microtime(true);
    for($i = 0; $i < $num; $i++){
        $a->getClassExplode();
    }
    $end = microtime(true);
    $res["Explode"][] = ($end-$start);
}

echo "Reflection: ".array_sum($res["Reflection"])/count($res["Reflection"])." s ".$a->getClassReflection()."\n";
echo "Basename: ".array_sum($res["Basename"])/count($res["Basename"])." s ".$a->getClassBasename()."\n";
echo "Explode: ".array_sum($res["Explode"])/count($res["Explode"])." s ".$a->getClassExplode()."\n";

Kết quả thực sự làm tôi ngạc nhiên. Tôi nghĩ rằng giải pháp nổ sẽ là cách nhanh nhất để đi ...

Julian

8.4988 Huy hiệu vàng53 Huy hiệu bạc89 Huy hiệu Đồng8 gold badges53 silver badges89 bronze badges

Đã trả lời ngày 24 tháng 8 năm 2014 lúc 14:36Aug 24, 2014 at 14:36

Hướng dẫn php get class name without namespace laravel - php lấy tên lớp mà không có không gian tên laravel

HirnhamsterhirnhamsterHirnhamster

6.7327 Huy hiệu vàng41 Huy hiệu bạc68 Huy hiệu Đồng7 gold badges41 silver badges68 bronze badges

10

Tôi đã thêm chuỗi con vào bài kiểm tra của https://stackoverflow.com/a/25472778/2386943 và đó là cách nhanh chóng tôi có thể kiểm tra (CentOS PHP 5.3.3, Ubuntu Php 5.5.9) cả hai với i5.

$classNameWithNamespace=get_class($this);
return substr($classNameWithNamespace, strrpos($classNameWithNamespace, '\\')+1);

Kết quả

Reflection: 0.068084406852722 s ClassA
Basename: 0.12301609516144 s ClassA
Explode: 0.14073524475098 s ClassA
Substring: 0.059865570068359 s ClassA 

Mã số

namespace foo\bar\baz;
class ClassA{
  public function getClassExplode(){
    $c = array_pop(explode('\\', get_class($this)));
    return $c;
  }

  public function getClassReflection(){
    $c = (new \ReflectionClass($this))->getShortName();
    return $c;
  }

  public function getClassBasename(){
    $c = basename(str_replace('\\', '/', get_class($this)));
    return $c;
  }

  public function getClassSubstring(){
    $classNameWithNamespace = get_class($this);
    return substr($classNameWithNamespace, strrpos($classNameWithNamespace, '\\')+1);
  }
}

$a = new ClassA();
$num = 100000;

$rounds = 10;
$res = array(
    "Reflection" => array(),
    "Basename" => array(),
    "Explode" => array(),
    "Substring" => array()
);

for($r = 0; $r < $rounds; $r++){

  $start = microtime(true);
  for($i = 0; $i < $num; $i++){
    $a->getClassReflection();
  }
  $end = microtime(true);
  $res["Reflection"][] = ($end-$start);

  $start = microtime(true);
  for($i = 0; $i < $num; $i++){
    $a->getClassBasename();
  }
  $end = microtime(true);
  $res["Basename"][] = ($end-$start);

  $start = microtime(true);
  for($i = 0; $i < $num; $i++){
    $a->getClassExplode();
  }
  $end = microtime(true);
  $res["Explode"][] = ($end-$start);

  $start = microtime(true);
  for($i = 0; $i < $num; $i++){
    $a->getClassSubstring();
  }
  $end = microtime(true);
  $res["Substring"][] = ($end-$start);
}

echo "Reflection: ".array_sum($res["Reflection"])/count($res["Reflection"])." s ".$a->getClassReflection()."\n";
echo "Basename: ".array_sum($res["Basename"])/count($res["Basename"])." s ".$a->getClassBasename()."\n";
echo "Explode: ".array_sum($res["Explode"])/count($res["Explode"])." s ".$a->getClassExplode()."\n";
echo "Substring: ".array_sum($res["Substring"])/count($res["Substring"])." s ".$a->getClassSubstring()."\n";

==UPDATE==

Kết quả thực sự làm tôi ngạc nhiên. Tôi nghĩ rằng giải pháp nổ sẽ là cách nhanh nhất để đi ...

return substr(strrchr(get_class($this), '\\'), 1);

Julian

Reflection: 0.073065280914307 s ClassA
Basename: 0.12585079669952 s ClassA
Explode: 0.14593172073364 s ClassA
Substring: 0.060415267944336 s ClassA
SubstringStrChr: 0.059880912303925 s ClassA

8.4988 Huy hiệu vàng53 Huy hiệu bạc89 Huy hiệu ĐồngDec 13, 2014 at 10:10

Đã trả lời ngày 24 tháng 8 năm 2014 lúc 14:36MaBi

Hirnhamsterhirnhamster3 gold badges13 silver badges19 bronze badges

11

6.7327 Huy hiệu vàng41 Huy hiệu bạc68 Huy hiệu Đồng

<?php

// usage anywhere
// returns HelloWorld
$name = class_basename('Path\To\YourClass\HelloWorld');

// usage inside a class
// returns HelloWorld
$name = class_basename(__CLASS__);


/**
 * Get the class "basename" of the given object / class.
 *
 * @param  string|object  $class
 * @return string
 */
function class_basename($class)
{
    $class = is_object($class) ? get_class($class) : $class;

    return basename(str_replace('\\', '/', $class));
}

Tôi đã thêm chuỗi con vào bài kiểm tra của https://stackoverflow.com/a/25472778/2386943 và đó là cách nhanh chóng tôi có thể kiểm tra (CentOS PHP 5.3.3, Ubuntu Php 5.5.9) cả hai với i5.

Như đã đề cập trong các bình luận của @mrbandersnatch thậm chí còn có một cách nhanh hơn để làm điều này:33 gold badges153 silver badges261 bronze badges

Dưới đây là các kết quả kiểm tra được cập nhật với "SubringsTrchr" (tiết kiệm tới khoảng 0,001 s):Nov 3, 2016 at 9:41

Hướng dẫn php get class name without namespace laravel - php lấy tên lớp mà không có không gian tên laravel

Đã trả lời ngày 13 tháng 12 năm 2014 lúc 10:10spetsnaz

Mabimabi1 gold badge14 silver badges11 bronze badges

4

1.3023 huy hiệu vàng13 Huy hiệu bạc19 Huy hiệu đồng

basename(str_replace('\\', '/', get_class($object)));

Dưới đây là một cách dễ dàng hơn để làm điều này nếu bạn đang sử dụng Laravel PHP Framework:Jan 9, 2014 at 8:58

Hướng dẫn php get class name without namespace laravel - php lấy tên lớp mà không có không gian tên laravel

John Magnoliaarzzzen

16.2K33 Huy hiệu vàng153 Huy hiệu bạc261 Huy hiệu Đồng1 silver badge9 bronze badges

5

Đã trả lời ngày 3 tháng 11 năm 2016 lúc 9:41

Reflection: 1.967512512207 s ClassA
Basename:   2.6840535163879 s ClassA
Explode:    2.6507515668869 s ClassA
0

Spetsnazspetsnaz

1.1111 Huy hiệu vàng14 Huy hiệu bạc11 Huy hiệu đồngAug 14, 2014 at 12:49

Hướng dẫn php get class name without namespace laravel - php lấy tên lớp mà không có không gian tên laravel

Tôi sử dụng cái này:flori

Đã trả lời ngày 9 tháng 1 năm 2014 lúc 8:583 gold badges53 silver badges60 bronze badges

1

Arzzzenarzzzen

Reflection: 1.967512512207 s ClassA
Basename:   2.6840535163879 s ClassA
Explode:    2.6507515668869 s ClassA
1

Huy hiệu Silver 3611 Huy hiệu Đồng

  • Để lấy tên ngắn làm một lớp lót (kể từ Php 5.4): you're going to use reflection anyways, using
    Reflection: 0.068084406852722 s ClassA
    Basename: 0.12301609516144 s ClassA
    Explode: 0.14073524475098 s ClassA
    Substring: 0.059865570068359 s ClassA 
    
    6 is the fastest method however; using reflection only to get the short name it is almost the slowest method.
  • Đó là một cách tiếp cận sạch sẽ và hợp lý nhanh chóng.
  • Đã trả lời ngày 14 tháng 8 năm 2014 lúc 12:49

Floriflori

Reflection: 1.967512512207 s ClassA
Basename:   2.6840535163879 s ClassA
Explode:    2.6507515668869 s ClassA
2

Huy hiệu vàng 13K353 Huy hiệu bạc60 Huy hiệu đồngDec 21, 2016 at 13:44

Hướng dẫn php get class name without namespace laravel - php lấy tên lớp mà không có không gian tên laravel

Tôi thấy mình trong một tình huống duy nhất mà

Reflection: 0.068084406852722 s ClassA
Basename: 0.12301609516144 s ClassA
Explode: 0.14073524475098 s ClassA
Substring: 0.059865570068359 s ClassA 
1 không thể được sử dụng (cụ thể là các đặc điểm đặt tên) và tôi cần tên ngắn theo cách hiệu quả nhất có thể vì vậy tôi đã tự mình thực hiện một chút điểm chuẩn. Nó bao gồm tất cả các phương pháp và biến thể khác nhau từ các câu trả lời trong câu hỏi này.Xorifelse

Một danh sách của toàn bộ kết quả là ở đây nhưng đây là những điểm nổi bật:1 gold badge25 silver badges38 bronze badges

Nếu bạn sẽ sử dụng phản xạ dù sao đi nữa, tuy nhiên, sử dụng

Reflection: 0.068084406852722 s ClassA
Basename: 0.12301609516144 s ClassA
Explode: 0.14073524475098 s ClassA
Substring: 0.059865570068359 s ClassA 
6 là phương pháp nhanh nhất; Chỉ sử dụng phản xạ để có được tên ngắn, nó gần như là phương pháp chậm nhất.

Reflection: 1.967512512207 s ClassA
Basename:   2.6840535163879 s ClassA
Explode:    2.6507515668869 s ClassA
3

Reflection: 0.068084406852722 s ClassA
Basename: 0.12301609516144 s ClassA
Explode: 0.14073524475098 s ClassA
Substring: 0.059865570068359 s ClassA 
7 có thể trả về một giá trị sai nếu đối tượng không ở trong không gian tên nên trong khi
Reflection: 0.068084406852722 s ClassA
Basename: 0.12301609516144 s ClassA
Explode: 0.14073524475098 s ClassA
Substring: 0.059865570068359 s ClassA 
8 chậm hơn một chút, tôi sẽ nói đây là người chiến thắng.Feb 1, 2018 at 6:46

m13rm13rm13r

Để làm cho

Reflection: 0.068084406852722 s ClassA
Basename: 0.12301609516144 s ClassA
Explode: 0.14073524475098 s ClassA
Substring: 0.059865570068359 s ClassA 
9 tương thích giữa Linux và Windows, bạn cần sử dụng
namespace foo\bar\baz;
class ClassA{
  public function getClassExplode(){
    $c = array_pop(explode('\\', get_class($this)));
    return $c;
  }

  public function getClassReflection(){
    $c = (new \ReflectionClass($this))->getShortName();
    return $c;
  }

  public function getClassBasename(){
    $c = basename(str_replace('\\', '/', get_class($this)));
    return $c;
  }

  public function getClassSubstring(){
    $classNameWithNamespace = get_class($this);
    return substr($classNameWithNamespace, strrpos($classNameWithNamespace, '\\')+1);
  }
}

$a = new ClassA();
$num = 100000;

$rounds = 10;
$res = array(
    "Reflection" => array(),
    "Basename" => array(),
    "Explode" => array(),
    "Substring" => array()
);

for($r = 0; $r < $rounds; $r++){

  $start = microtime(true);
  for($i = 0; $i < $num; $i++){
    $a->getClassReflection();
  }
  $end = microtime(true);
  $res["Reflection"][] = ($end-$start);

  $start = microtime(true);
  for($i = 0; $i < $num; $i++){
    $a->getClassBasename();
  }
  $end = microtime(true);
  $res["Basename"][] = ($end-$start);

  $start = microtime(true);
  for($i = 0; $i < $num; $i++){
    $a->getClassExplode();
  }
  $end = microtime(true);
  $res["Explode"][] = ($end-$start);

  $start = microtime(true);
  for($i = 0; $i < $num; $i++){
    $a->getClassSubstring();
  }
  $end = microtime(true);
  $res["Substring"][] = ($end-$start);
}

echo "Reflection: ".array_sum($res["Reflection"])/count($res["Reflection"])." s ".$a->getClassReflection()."\n";
echo "Basename: ".array_sum($res["Basename"])/count($res["Basename"])." s ".$a->getClassBasename()."\n";
echo "Explode: ".array_sum($res["Explode"])/count($res["Explode"])." s ".$a->getClassExplode()."\n";
echo "Substring: ".array_sum($res["Substring"])/count($res["Substring"])." s ".$a->getClassSubstring()."\n";
0, điều này làm cho phương pháp này chậm nhất trong tất cả.2 gold badges27 silver badges38 bronze badges

0

Một bảng kết quả đơn giản hóa, tốc độ được đo so với phương pháp chậm nhất:

Reflection: 1.967512512207 s ClassA
Basename:   2.6840535163879 s ClassA
Explode:    2.6507515668869 s ClassA
4

Đã trả lời ngày 21 tháng 12 năm 2016 lúc 13:44

Xorifelsexorifelse

7,7231 Huy hiệu vàng25 Huy hiệu bạc38 Huy hiệu đồng

Reflection: 1.967512512207 s ClassA
Basename:   2.6840535163879 s ClassA
Explode:    2.6507515668869 s ClassA
6

Bạn có thể sử dụng

namespace foo\bar\baz;
class ClassA{
  public function getClassExplode(){
    $c = array_pop(explode('\\', get_class($this)));
    return $c;
  }

  public function getClassReflection(){
    $c = (new \ReflectionClass($this))->getShortName();
    return $c;
  }

  public function getClassBasename(){
    $c = basename(str_replace('\\', '/', get_class($this)));
    return $c;
  }

  public function getClassSubstring(){
    $classNameWithNamespace = get_class($this);
    return substr($classNameWithNamespace, strrpos($classNameWithNamespace, '\\')+1);
  }
}

$a = new ClassA();
$num = 100000;

$rounds = 10;
$res = array(
    "Reflection" => array(),
    "Basename" => array(),
    "Explode" => array(),
    "Substring" => array()
);

for($r = 0; $r < $rounds; $r++){

  $start = microtime(true);
  for($i = 0; $i < $num; $i++){
    $a->getClassReflection();
  }
  $end = microtime(true);
  $res["Reflection"][] = ($end-$start);

  $start = microtime(true);
  for($i = 0; $i < $num; $i++){
    $a->getClassBasename();
  }
  $end = microtime(true);
  $res["Basename"][] = ($end-$start);

  $start = microtime(true);
  for($i = 0; $i < $num; $i++){
    $a->getClassExplode();
  }
  $end = microtime(true);
  $res["Explode"][] = ($end-$start);

  $start = microtime(true);
  for($i = 0; $i < $num; $i++){
    $a->getClassSubstring();
  }
  $end = microtime(true);
  $res["Substring"][] = ($end-$start);
}

echo "Reflection: ".array_sum($res["Reflection"])/count($res["Reflection"])." s ".$a->getClassReflection()."\n";
echo "Basename: ".array_sum($res["Basename"])/count($res["Basename"])." s ".$a->getClassBasename()."\n";
echo "Explode: ".array_sum($res["Explode"])/count($res["Explode"])." s ".$a->getClassExplode()."\n";
echo "Substring: ".array_sum($res["Substring"])/count($res["Substring"])." s ".$a->getClassSubstring()."\n";
1 để tách không gian tên và
namespace foo\bar\baz;
class ClassA{
  public function getClassExplode(){
    $c = array_pop(explode('\\', get_class($this)));
    return $c;
  }

  public function getClassReflection(){
    $c = (new \ReflectionClass($this))->getShortName();
    return $c;
  }

  public function getClassBasename(){
    $c = basename(str_replace('\\', '/', get_class($this)));
    return $c;
  }

  public function getClassSubstring(){
    $classNameWithNamespace = get_class($this);
    return substr($classNameWithNamespace, strrpos($classNameWithNamespace, '\\')+1);
  }
}

$a = new ClassA();
$num = 100000;

$rounds = 10;
$res = array(
    "Reflection" => array(),
    "Basename" => array(),
    "Explode" => array(),
    "Substring" => array()
);

for($r = 0; $r < $rounds; $r++){

  $start = microtime(true);
  for($i = 0; $i < $num; $i++){
    $a->getClassReflection();
  }
  $end = microtime(true);
  $res["Reflection"][] = ($end-$start);

  $start = microtime(true);
  for($i = 0; $i < $num; $i++){
    $a->getClassBasename();
  }
  $end = microtime(true);
  $res["Basename"][] = ($end-$start);

  $start = microtime(true);
  for($i = 0; $i < $num; $i++){
    $a->getClassExplode();
  }
  $end = microtime(true);
  $res["Explode"][] = ($end-$start);

  $start = microtime(true);
  for($i = 0; $i < $num; $i++){
    $a->getClassSubstring();
  }
  $end = microtime(true);
  $res["Substring"][] = ($end-$start);
}

echo "Reflection: ".array_sum($res["Reflection"])/count($res["Reflection"])." s ".$a->getClassReflection()."\n";
echo "Basename: ".array_sum($res["Basename"])/count($res["Basename"])." s ".$a->getClassBasename()."\n";
echo "Explode: ".array_sum($res["Explode"])/count($res["Explode"])." s ".$a->getClassExplode()."\n";
echo "Substring: ".array_sum($res["Substring"])/count($res["Substring"])." s ".$a->getClassSubstring()."\n";
2 để lấy tên lớp:

Reflection: 1.967512512207 s ClassA
Basename:   2.6840535163879 s ClassA
Explode:    2.6507515668869 s ClassA
7

Đã trả lời ngày 1 tháng 2 năm 2018 lúc 6:46Feb 28, 2014 at 12:35

2.2702 Huy hiệu vàng27 Huy hiệu bạc38 Huy hiệu ĐồngOzzyCzech

Đây là giải pháp đơn giản cho PHP 5.4+2 gold badges47 silver badges31 bronze badges

Điều gì sẽ trở lại?

Reflection: 1.967512512207 s ClassA
Basename:   2.6840535163879 s ClassA
Explode:    2.6507515668869 s ClassA
8

Reflection: 1.967512512207 s ClassA
Basename:   2.6840535163879 s ClassA
Explode:    2.6507515668869 s ClassA
5Jan 22, 2019 at 22:59

Tên lớp mở rộng và không gian tên hoạt động tốt để:Seth

Thế còn lớp học trong không gian tên toàn cầu?1 silver badge2 bronze badges

1

Đã trả lời ngày 28 tháng 2 năm 2014 lúc 12:35

Reflection: 1.967512512207 s ClassA
Basename:   2.6840535163879 s ClassA
Explode:    2.6507515668869 s ClassA
9

Ozzyczechozzyczech

Example:

namespace foo\bar\baz;

class ClassA{
    public function getClassExplode(){
        return explode('\\', static::class)[0];
    }

    public function getClassReflection(){
        return (new \ReflectionClass($this))->getShortName();
    }

    public function getClassBasename(){
        return basename(str_replace('\\', '/', static::class));
    }
}

$a = new ClassA();
$num = 100000;

$rounds = 10;
$res = array(
    "Reflection" => array(),
    "Basename" => array(),
    "Explode" => array(),
);

for($r = 0; $r < $rounds; $r++){

    $start = microtime(true);
    for($i = 0; $i < $num; $i++){
        $a->getClassReflection();
    }
    $end = microtime(true);
    $res["Reflection"][] = ($end-$start);

    $start = microtime(true);
    for($i = 0; $i < $num; $i++){
        $a->getClassBasename();
    }
    $end = microtime(true);
    $res["Basename"][] = ($end-$start);

    $start = microtime(true);
    for($i = 0; $i < $num; $i++){
        $a->getClassExplode();
    }
    $end = microtime(true);
    $res["Explode"][] = ($end-$start);
}

echo "Reflection: ".array_sum($res["Reflection"])/count($res["Reflection"])." s ".$a->getClassReflection()."\n";
echo "Basename: ".array_sum($res["Basename"])/count($res["Basename"])." s ".$a->getClassBasename()."\n";
echo "Explode: ".array_sum($res["Explode"])/count($res["Explode"])." s ".$a->getClassExplode()."\n";
0

9.0172 Huy hiệu vàng47 Huy hiệu bạc31 Huy hiệu ĐồngSep 21, 2016 at 12:54

Hướng dẫn php get class name without namespace laravel - php lấy tên lớp mà không có không gian tên laravel

Tôi biết đây là một bài viết cũ nhưng đây là những gì tôi sử dụng - nhanh hơn tất cả được đăng ở trên chỉ gọi phương thức này từ lớp của bạn, nhanh hơn rất nhiều so với sử dụng phản xạThe Onin

Đã trả lời ngày 22 tháng 1 năm 2019 lúc 22:592 gold badges33 silver badges51 bronze badges

Sethseth

namespace foo\bar\baz;

class ClassA{
    public function getClassExplode(){
        return explode('\\', static::class)[0];
    }

    public function getClassReflection(){
        return (new \ReflectionClass($this))->getShortName();
    }

    public function getClassBasename(){
        return basename(str_replace('\\', '/', static::class));
    }
}

$a = new ClassA();
$num = 100000;

$rounds = 10;
$res = array(
    "Reflection" => array(),
    "Basename" => array(),
    "Explode" => array(),
);

for($r = 0; $r < $rounds; $r++){

    $start = microtime(true);
    for($i = 0; $i < $num; $i++){
        $a->getClassReflection();
    }
    $end = microtime(true);
    $res["Reflection"][] = ($end-$start);

    $start = microtime(true);
    for($i = 0; $i < $num; $i++){
        $a->getClassBasename();
    }
    $end = microtime(true);
    $res["Basename"][] = ($end-$start);

    $start = microtime(true);
    for($i = 0; $i < $num; $i++){
        $a->getClassExplode();
    }
    $end = microtime(true);
    $res["Explode"][] = ($end-$start);
}

echo "Reflection: ".array_sum($res["Reflection"])/count($res["Reflection"])." s ".$a->getClassReflection()."\n";
echo "Basename: ".array_sum($res["Basename"])/count($res["Basename"])." s ".$a->getClassBasename()."\n";
echo "Explode: ".array_sum($res["Explode"])/count($res["Explode"])." s ".$a->getClassExplode()."\n";
1

Điều này có thể dễ dàng được sửa bằng cách tiền tố

namespace foo\bar\baz;
class ClassA{
  public function getClassExplode(){
    $c = array_pop(explode('\\', get_class($this)));
    return $c;
  }

  public function getClassReflection(){
    $c = (new \ReflectionClass($this))->getShortName();
    return $c;
  }

  public function getClassBasename(){
    $c = basename(str_replace('\\', '/', get_class($this)));
    return $c;
  }

  public function getClassSubstring(){
    $classNameWithNamespace = get_class($this);
    return substr($classNameWithNamespace, strrpos($classNameWithNamespace, '\\')+1);
  }
}

$a = new ClassA();
$num = 100000;

$rounds = 10;
$res = array(
    "Reflection" => array(),
    "Basename" => array(),
    "Explode" => array(),
    "Substring" => array()
);

for($r = 0; $r < $rounds; $r++){

  $start = microtime(true);
  for($i = 0; $i < $num; $i++){
    $a->getClassReflection();
  }
  $end = microtime(true);
  $res["Reflection"][] = ($end-$start);

  $start = microtime(true);
  for($i = 0; $i < $num; $i++){
    $a->getClassBasename();
  }
  $end = microtime(true);
  $res["Basename"][] = ($end-$start);

  $start = microtime(true);
  for($i = 0; $i < $num; $i++){
    $a->getClassExplode();
  }
  $end = microtime(true);
  $res["Explode"][] = ($end-$start);

  $start = microtime(true);
  for($i = 0; $i < $num; $i++){
    $a->getClassSubstring();
  }
  $end = microtime(true);
  $res["Substring"][] = ($end-$start);
}

echo "Reflection: ".array_sum($res["Reflection"])/count($res["Reflection"])." s ".$a->getClassReflection()."\n";
echo "Basename: ".array_sum($res["Basename"])/count($res["Basename"])." s ".$a->getClassBasename()."\n";
echo "Explode: ".array_sum($res["Explode"])/count($res["Explode"])." s ".$a->getClassExplode()."\n";
echo "Substring: ".array_sum($res["Substring"])/count($res["Substring"])." s ".$a->getClassSubstring()."\n";
3 với dấu gạch chéo ngược:

namespace foo\bar\baz;

class ClassA{
    public function getClassExplode(){
        return explode('\\', static::class)[0];
    }

    public function getClassReflection(){
        return (new \ReflectionClass($this))->getShortName();
    }

    public function getClassBasename(){
        return basename(str_replace('\\', '/', static::class));
    }
}

$a = new ClassA();
$num = 100000;

$rounds = 10;
$res = array(
    "Reflection" => array(),
    "Basename" => array(),
    "Explode" => array(),
);

for($r = 0; $r < $rounds; $r++){

    $start = microtime(true);
    for($i = 0; $i < $num; $i++){
        $a->getClassReflection();
    }
    $end = microtime(true);
    $res["Reflection"][] = ($end-$start);

    $start = microtime(true);
    for($i = 0; $i < $num; $i++){
        $a->getClassBasename();
    }
    $end = microtime(true);
    $res["Basename"][] = ($end-$start);

    $start = microtime(true);
    for($i = 0; $i < $num; $i++){
        $a->getClassExplode();
    }
    $end = microtime(true);
    $res["Explode"][] = ($end-$start);
}

echo "Reflection: ".array_sum($res["Reflection"])/count($res["Reflection"])." s ".$a->getClassReflection()."\n";
echo "Basename: ".array_sum($res["Basename"])/count($res["Basename"])." s ".$a->getClassBasename()."\n";
echo "Explode: ".array_sum($res["Explode"])/count($res["Explode"])." s ".$a->getClassExplode()."\n";
2

Bây giờ các lớp cũng không có không gian tên sẽ trả về giá trị phù hợp.

Đã trả lời ngày 5 tháng 2 năm 2016 lúc 9:51Feb 5, 2016 at 9:51

Tim timTim

2.41024 Huy hiệu bạc18 Huy hiệu đồng24 silver badges18 bronze badges

Dựa trên câu trả lời của @mabi, tôi đã thực hiện điều này:

namespace foo\bar\baz;

class ClassA{
    public function getClassExplode(){
        return explode('\\', static::class)[0];
    }

    public function getClassReflection(){
        return (new \ReflectionClass($this))->getShortName();
    }

    public function getClassBasename(){
        return basename(str_replace('\\', '/', static::class));
    }
}

$a = new ClassA();
$num = 100000;

$rounds = 10;
$res = array(
    "Reflection" => array(),
    "Basename" => array(),
    "Explode" => array(),
);

for($r = 0; $r < $rounds; $r++){

    $start = microtime(true);
    for($i = 0; $i < $num; $i++){
        $a->getClassReflection();
    }
    $end = microtime(true);
    $res["Reflection"][] = ($end-$start);

    $start = microtime(true);
    for($i = 0; $i < $num; $i++){
        $a->getClassBasename();
    }
    $end = microtime(true);
    $res["Basename"][] = ($end-$start);

    $start = microtime(true);
    for($i = 0; $i < $num; $i++){
        $a->getClassExplode();
    }
    $end = microtime(true);
    $res["Explode"][] = ($end-$start);
}

echo "Reflection: ".array_sum($res["Reflection"])/count($res["Reflection"])." s ".$a->getClassReflection()."\n";
echo "Basename: ".array_sum($res["Basename"])/count($res["Basename"])." s ".$a->getClassBasename()."\n";
echo "Explode: ".array_sum($res["Explode"])/count($res["Explode"])." s ".$a->getClassExplode()."\n";
3

Mà bạn có thể sử dụng như vậy:

namespace foo\bar\baz;

class ClassA{
    public function getClassExplode(){
        return explode('\\', static::class)[0];
    }

    public function getClassReflection(){
        return (new \ReflectionClass($this))->getShortName();
    }

    public function getClassBasename(){
        return basename(str_replace('\\', '/', static::class));
    }
}

$a = new ClassA();
$num = 100000;

$rounds = 10;
$res = array(
    "Reflection" => array(),
    "Basename" => array(),
    "Explode" => array(),
);

for($r = 0; $r < $rounds; $r++){

    $start = microtime(true);
    for($i = 0; $i < $num; $i++){
        $a->getClassReflection();
    }
    $end = microtime(true);
    $res["Reflection"][] = ($end-$start);

    $start = microtime(true);
    for($i = 0; $i < $num; $i++){
        $a->getClassBasename();
    }
    $end = microtime(true);
    $res["Basename"][] = ($end-$start);

    $start = microtime(true);
    for($i = 0; $i < $num; $i++){
        $a->getClassExplode();
    }
    $end = microtime(true);
    $res["Explode"][] = ($end-$start);
}

echo "Reflection: ".array_sum($res["Reflection"])/count($res["Reflection"])." s ".$a->getClassReflection()."\n";
echo "Basename: ".array_sum($res["Basename"])/count($res["Basename"])." s ".$a->getClassBasename()."\n";
echo "Explode: ".array_sum($res["Explode"])/count($res["Explode"])." s ".$a->getClassExplode()."\n";
4

namespace foo\bar\baz;
class ClassA{
  public function getClassExplode(){
    $c = array_pop(explode('\\', get_class($this)));
    return $c;
  }

  public function getClassReflection(){
    $c = (new \ReflectionClass($this))->getShortName();
    return $c;
  }

  public function getClassBasename(){
    $c = basename(str_replace('\\', '/', get_class($this)));
    return $c;
  }

  public function getClassSubstring(){
    $classNameWithNamespace = get_class($this);
    return substr($classNameWithNamespace, strrpos($classNameWithNamespace, '\\')+1);
  }
}

$a = new ClassA();
$num = 100000;

$rounds = 10;
$res = array(
    "Reflection" => array(),
    "Basename" => array(),
    "Explode" => array(),
    "Substring" => array()
);

for($r = 0; $r < $rounds; $r++){

  $start = microtime(true);
  for($i = 0; $i < $num; $i++){
    $a->getClassReflection();
  }
  $end = microtime(true);
  $res["Reflection"][] = ($end-$start);

  $start = microtime(true);
  for($i = 0; $i < $num; $i++){
    $a->getClassBasename();
  }
  $end = microtime(true);
  $res["Basename"][] = ($end-$start);

  $start = microtime(true);
  for($i = 0; $i < $num; $i++){
    $a->getClassExplode();
  }
  $end = microtime(true);
  $res["Explode"][] = ($end-$start);

  $start = microtime(true);
  for($i = 0; $i < $num; $i++){
    $a->getClassSubstring();
  }
  $end = microtime(true);
  $res["Substring"][] = ($end-$start);
}

echo "Reflection: ".array_sum($res["Reflection"])/count($res["Reflection"])." s ".$a->getClassReflection()."\n";
echo "Basename: ".array_sum($res["Basename"])/count($res["Basename"])." s ".$a->getClassBasename()."\n";
echo "Explode: ".array_sum($res["Explode"])/count($res["Explode"])." s ".$a->getClassExplode()."\n";
echo "Substring: ".array_sum($res["Substring"])/count($res["Substring"])." s ".$a->getClassSubstring()."\n";
8 Trả về
namespace foo\bar\baz;
class ClassA{
  public function getClassExplode(){
    $c = array_pop(explode('\\', get_class($this)));
    return $c;
  }

  public function getClassReflection(){
    $c = (new \ReflectionClass($this))->getShortName();
    return $c;
  }

  public function getClassBasename(){
    $c = basename(str_replace('\\', '/', get_class($this)));
    return $c;
  }

  public function getClassSubstring(){
    $classNameWithNamespace = get_class($this);
    return substr($classNameWithNamespace, strrpos($classNameWithNamespace, '\\')+1);
  }
}

$a = new ClassA();
$num = 100000;

$rounds = 10;
$res = array(
    "Reflection" => array(),
    "Basename" => array(),
    "Explode" => array(),
    "Substring" => array()
);

for($r = 0; $r < $rounds; $r++){

  $start = microtime(true);
  for($i = 0; $i < $num; $i++){
    $a->getClassReflection();
  }
  $end = microtime(true);
  $res["Reflection"][] = ($end-$start);

  $start = microtime(true);
  for($i = 0; $i < $num; $i++){
    $a->getClassBasename();
  }
  $end = microtime(true);
  $res["Basename"][] = ($end-$start);

  $start = microtime(true);
  for($i = 0; $i < $num; $i++){
    $a->getClassExplode();
  }
  $end = microtime(true);
  $res["Explode"][] = ($end-$start);

  $start = microtime(true);
  for($i = 0; $i < $num; $i++){
    $a->getClassSubstring();
  }
  $end = microtime(true);
  $res["Substring"][] = ($end-$start);
}

echo "Reflection: ".array_sum($res["Reflection"])/count($res["Reflection"])." s ".$a->getClassReflection()."\n";
echo "Basename: ".array_sum($res["Basename"])/count($res["Basename"])." s ".$a->getClassBasename()."\n";
echo "Explode: ".array_sum($res["Explode"])/count($res["Explode"])." s ".$a->getClassExplode()."\n";
echo "Substring: ".array_sum($res["Substring"])/count($res["Substring"])." s ".$a->getClassSubstring()."\n";
9, nhưng
return substr(strrchr(get_class($this), '\\'), 1);
0 trả về
return substr(strrchr(get_class($this), '\\'), 1);
1.

Hoạt động cho PHP> = 5.5.

Đã trả lời ngày 31 tháng 5 năm 2016 lúc 16:08May 31, 2016 at 16:08

Tristan Jahiertristan JahierTristan Jahier

1.1161 Huy hiệu vàng12 Huy hiệu bạc27 Huy hiệu đồng1 gold badge12 silver badges27 bronze badges

Một regex cũ tốt dường như nhanh hơn hầu hết các phương pháp được hiển thị trước đó:

namespace foo\bar\baz;

class ClassA{
    public function getClassExplode(){
        return explode('\\', static::class)[0];
    }

    public function getClassReflection(){
        return (new \ReflectionClass($this))->getShortName();
    }

    public function getClassBasename(){
        return basename(str_replace('\\', '/', static::class));
    }
}

$a = new ClassA();
$num = 100000;

$rounds = 10;
$res = array(
    "Reflection" => array(),
    "Basename" => array(),
    "Explode" => array(),
);

for($r = 0; $r < $rounds; $r++){

    $start = microtime(true);
    for($i = 0; $i < $num; $i++){
        $a->getClassReflection();
    }
    $end = microtime(true);
    $res["Reflection"][] = ($end-$start);

    $start = microtime(true);
    for($i = 0; $i < $num; $i++){
        $a->getClassBasename();
    }
    $end = microtime(true);
    $res["Basename"][] = ($end-$start);

    $start = microtime(true);
    for($i = 0; $i < $num; $i++){
        $a->getClassExplode();
    }
    $end = microtime(true);
    $res["Explode"][] = ($end-$start);
}

echo "Reflection: ".array_sum($res["Reflection"])/count($res["Reflection"])." s ".$a->getClassReflection()."\n";
echo "Basename: ".array_sum($res["Basename"])/count($res["Basename"])." s ".$a->getClassBasename()."\n";
echo "Explode: ".array_sum($res["Explode"])/count($res["Explode"])." s ".$a->getClassExplode()."\n";
5

Vì vậy, điều này hoạt động ngay cả khi bạn cung cấp một tên lớp ngắn hoặc một tên lớp đủ điều kiện (kinh điển).

Những gì Regex làm là nó tiêu thụ tất cả các ký tự trước đó cho đến khi máy phân cách cuối cùng được tìm thấy (cũng được tiêu thụ). Vì vậy, chuỗi còn lại sẽ là tên lớp ngắn.

Nếu bạn muốn sử dụng một dấu phân cách khác (ví dụ: /) thì chỉ cần sử dụng dấu phân cách đó. Hãy nhớ thoát khỏi dấu gạch chéo ngược (ví dụ: \) và cũng là char mẫu (tức là. /) Trong mẫu đầu vào.

Đã trả lời ngày 24 tháng 11 năm 2017 lúc 18:51Nov 24, 2017 at 18:51

Eugen Mihailescueugen MihailescuEugen Mihailescu

3.3582 Huy hiệu vàng29 Huy hiệu bạc29 Huy hiệu đồng2 gold badges29 silver badges29 bronze badges

Tìm thấy trên trang tài liệu của get_class, nơi nó được đăng bởi tôi tại nwhiting dot com.

namespace foo\bar\baz;

class ClassA{
    public function getClassExplode(){
        return explode('\\', static::class)[0];
    }

    public function getClassReflection(){
        return (new \ReflectionClass($this))->getShortName();
    }

    public function getClassBasename(){
        return basename(str_replace('\\', '/', static::class));
    }
}

$a = new ClassA();
$num = 100000;

$rounds = 10;
$res = array(
    "Reflection" => array(),
    "Basename" => array(),
    "Explode" => array(),
);

for($r = 0; $r < $rounds; $r++){

    $start = microtime(true);
    for($i = 0; $i < $num; $i++){
        $a->getClassReflection();
    }
    $end = microtime(true);
    $res["Reflection"][] = ($end-$start);

    $start = microtime(true);
    for($i = 0; $i < $num; $i++){
        $a->getClassBasename();
    }
    $end = microtime(true);
    $res["Basename"][] = ($end-$start);

    $start = microtime(true);
    for($i = 0; $i < $num; $i++){
        $a->getClassExplode();
    }
    $end = microtime(true);
    $res["Explode"][] = ($end-$start);
}

echo "Reflection: ".array_sum($res["Reflection"])/count($res["Reflection"])." s ".$a->getClassReflection()."\n";
echo "Basename: ".array_sum($res["Basename"])/count($res["Basename"])." s ".$a->getClassBasename()."\n";
echo "Explode: ".array_sum($res["Explode"])/count($res["Explode"])." s ".$a->getClassExplode()."\n";
6

Nhưng ý tưởng về không gian tên là cấu trúc mã của bạn. Điều đó cũng có nghĩa là bạn có thể có các lớp có cùng tên trong nhiều không gian tên. Vì vậy, về mặt lý thuyết, đối tượng bạn vượt qua có thể có tên (bị tước) tên lớp, trong khi vẫn là một đối tượng hoàn toàn khác so với bạn mong đợi.

Bên cạnh đó, bạn có thể muốn kiểm tra một lớp cơ sở cụ thể, trong trường hợp đó

namespace foo\bar\baz;
class ClassA{
  public function getClassExplode(){
    $c = array_pop(explode('\\', get_class($this)));
    return $c;
  }

  public function getClassReflection(){
    $c = (new \ReflectionClass($this))->getShortName();
    return $c;
  }

  public function getClassBasename(){
    $c = basename(str_replace('\\', '/', get_class($this)));
    return $c;
  }

  public function getClassSubstring(){
    $classNameWithNamespace = get_class($this);
    return substr($classNameWithNamespace, strrpos($classNameWithNamespace, '\\')+1);
  }
}

$a = new ClassA();
$num = 100000;

$rounds = 10;
$res = array(
    "Reflection" => array(),
    "Basename" => array(),
    "Explode" => array(),
    "Substring" => array()
);

for($r = 0; $r < $rounds; $r++){

  $start = microtime(true);
  for($i = 0; $i < $num; $i++){
    $a->getClassReflection();
  }
  $end = microtime(true);
  $res["Reflection"][] = ($end-$start);

  $start = microtime(true);
  for($i = 0; $i < $num; $i++){
    $a->getClassBasename();
  }
  $end = microtime(true);
  $res["Basename"][] = ($end-$start);

  $start = microtime(true);
  for($i = 0; $i < $num; $i++){
    $a->getClassExplode();
  }
  $end = microtime(true);
  $res["Explode"][] = ($end-$start);

  $start = microtime(true);
  for($i = 0; $i < $num; $i++){
    $a->getClassSubstring();
  }
  $end = microtime(true);
  $res["Substring"][] = ($end-$start);
}

echo "Reflection: ".array_sum($res["Reflection"])/count($res["Reflection"])." s ".$a->getClassReflection()."\n";
echo "Basename: ".array_sum($res["Basename"])/count($res["Basename"])." s ".$a->getClassBasename()."\n";
echo "Explode: ".array_sum($res["Explode"])/count($res["Explode"])." s ".$a->getClassExplode()."\n";
echo "Substring: ".array_sum($res["Substring"])/count($res["Substring"])." s ".$a->getClassSubstring()."\n";
3 hoàn toàn không thực hiện được. Bạn có thể muốn kiểm tra nhà điều hành
Reflection: 0.068084406852722 s ClassA
Basename: 0.12301609516144 s ClassA
Explode: 0.14073524475098 s ClassA
Substring: 0.059865570068359 s ClassA 
1.

Đã trả lời ngày 11 tháng 11 năm 2013 lúc 8:33Nov 11, 2013 at 8:33

Hướng dẫn php get class name without namespace laravel - php lấy tên lớp mà không có không gian tên laravel

GoleztrolgoleztrolGolezTrol

Huy hiệu vàng 113K1717 gold badges181 silver badges202 bronze badges

Bạn đi đây:

namespace foo\bar\baz;

class ClassA{
    public function getClassExplode(){
        return explode('\\', static::class)[0];
    }

    public function getClassReflection(){
        return (new \ReflectionClass($this))->getShortName();
    }

    public function getClassBasename(){
        return basename(str_replace('\\', '/', static::class));
    }
}

$a = new ClassA();
$num = 100000;

$rounds = 10;
$res = array(
    "Reflection" => array(),
    "Basename" => array(),
    "Explode" => array(),
);

for($r = 0; $r < $rounds; $r++){

    $start = microtime(true);
    for($i = 0; $i < $num; $i++){
        $a->getClassReflection();
    }
    $end = microtime(true);
    $res["Reflection"][] = ($end-$start);

    $start = microtime(true);
    for($i = 0; $i < $num; $i++){
        $a->getClassBasename();
    }
    $end = microtime(true);
    $res["Basename"][] = ($end-$start);

    $start = microtime(true);
    for($i = 0; $i < $num; $i++){
        $a->getClassExplode();
    }
    $end = microtime(true);
    $res["Explode"][] = ($end-$start);
}

echo "Reflection: ".array_sum($res["Reflection"])/count($res["Reflection"])." s ".$a->getClassReflection()."\n";
echo "Basename: ".array_sum($res["Basename"])/count($res["Basename"])." s ".$a->getClassBasename()."\n";
echo "Explode: ".array_sum($res["Explode"])/count($res["Explode"])." s ".$a->getClassExplode()."\n";
7

Đã trả lời vào ngày 30 tháng 6 lúc 11:53Jun 30 at 11:53

Hướng dẫn php get class name without namespace laravel - php lấy tên lớp mà không có không gian tên laravel

X 47 48 - IRX 47 48 - IRX 47 48 - IR

1.0721 Huy hiệu vàng10 Huy hiệu bạc26 Huy hiệu đồng1 gold badge10 silver badges26 bronze badges

Trích dẫn php.net:

Trên Windows, cả dấu gạch chéo (/) và chao đảo () đều được sử dụng làm ký tự phân tách thư mục. Trong các môi trường khác, đó là chém phía trước (/).

Dựa trên thông tin này và mở rộng từ Arzzzen Trả lời, điều này sẽ hoạt động trên cả hai hệ thống Windows và Nix*:

namespace foo\bar\baz;

class ClassA{
    public function getClassExplode(){
        return explode('\\', static::class)[0];
    }

    public function getClassReflection(){
        return (new \ReflectionClass($this))->getShortName();
    }

    public function getClassBasename(){
        return basename(str_replace('\\', '/', static::class));
    }
}

$a = new ClassA();
$num = 100000;

$rounds = 10;
$res = array(
    "Reflection" => array(),
    "Basename" => array(),
    "Explode" => array(),
);

for($r = 0; $r < $rounds; $r++){

    $start = microtime(true);
    for($i = 0; $i < $num; $i++){
        $a->getClassReflection();
    }
    $end = microtime(true);
    $res["Reflection"][] = ($end-$start);

    $start = microtime(true);
    for($i = 0; $i < $num; $i++){
        $a->getClassBasename();
    }
    $end = microtime(true);
    $res["Basename"][] = ($end-$start);

    $start = microtime(true);
    for($i = 0; $i < $num; $i++){
        $a->getClassExplode();
    }
    $end = microtime(true);
    $res["Explode"][] = ($end-$start);
}

echo "Reflection: ".array_sum($res["Reflection"])/count($res["Reflection"])." s ".$a->getClassReflection()."\n";
echo "Basename: ".array_sum($res["Basename"])/count($res["Basename"])." s ".$a->getClassBasename()."\n";
echo "Explode: ".array_sum($res["Explode"])/count($res["Explode"])." s ".$a->getClassExplode()."\n";
8

Lưu ý: Tôi đã thực hiện một điểm chuẩn là

$classNameWithNamespace=get_class($this);
return substr($classNameWithNamespace, strrpos($classNameWithNamespace, '\\')+1);
9 so với
return substr(strrchr(get_class($this), '\\'), 1);
5 và sử dụng phản xạ nhanh hơn khoảng 20% ​​so với sử dụng phương pháp cơ sở, nhưng YMMV.
I did a benchmark of
$classNameWithNamespace=get_class($this);
return substr($classNameWithNamespace, strrpos($classNameWithNamespace, '\\')+1);
9 against
return substr(strrchr(get_class($this), '\\'), 1);
5 and using reflection is roughly 20% faster than using the basename approach, but YMMV.

Đã trả lời ngày 18 tháng 3 năm 2014 lúc 15:26Mar 18, 2014 at 15:26

NoisleednoiseBleednoisebleed

1.2991 Huy hiệu vàng12 Huy hiệu bạc26 Huy hiệu đồng1 gold badge12 silver badges26 bronze badges

Giải pháp dễ dàng nhất và IMHO hoạt động trong mọi môi trường là:

namespace foo\bar\baz;

class ClassA{
    public function getClassExplode(){
        return explode('\\', static::class)[0];
    }

    public function getClassReflection(){
        return (new \ReflectionClass($this))->getShortName();
    }

    public function getClassBasename(){
        return basename(str_replace('\\', '/', static::class));
    }
}

$a = new ClassA();
$num = 100000;

$rounds = 10;
$res = array(
    "Reflection" => array(),
    "Basename" => array(),
    "Explode" => array(),
);

for($r = 0; $r < $rounds; $r++){

    $start = microtime(true);
    for($i = 0; $i < $num; $i++){
        $a->getClassReflection();
    }
    $end = microtime(true);
    $res["Reflection"][] = ($end-$start);

    $start = microtime(true);
    for($i = 0; $i < $num; $i++){
        $a->getClassBasename();
    }
    $end = microtime(true);
    $res["Basename"][] = ($end-$start);

    $start = microtime(true);
    for($i = 0; $i < $num; $i++){
        $a->getClassExplode();
    }
    $end = microtime(true);
    $res["Explode"][] = ($end-$start);
}

echo "Reflection: ".array_sum($res["Reflection"])/count($res["Reflection"])." s ".$a->getClassReflection()."\n";
echo "Basename: ".array_sum($res["Basename"])/count($res["Basename"])." s ".$a->getClassBasename()."\n";
echo "Explode: ".array_sum($res["Explode"])/count($res["Explode"])." s ".$a->getClassExplode()."\n";
9

Đã trả lời ngày 8 tháng 4 năm 2014 lúc 21:54Apr 8, 2014 at 21:54

FleshgrinderfleshgrinderFleshgrinder

15.2k4 Huy hiệu vàng47 Huy hiệu bạc53 Huy hiệu Đồng4 gold badges47 silver badges53 bronze badges

2

$classNameWithNamespace=get_class($this);
return substr($classNameWithNamespace, strrpos($classNameWithNamespace, '\\')+1);
0

Đã trả lời ngày 12 tháng 9 năm 2014 lúc 21:36Sep 12, 2014 at 21:36

Hướng dẫn php get class name without namespace laravel - php lấy tên lớp mà không có không gian tên laravel

Salhalmalhalmalhal

22.4K7 Huy hiệu vàng110 Huy hiệu bạc123 Huy hiệu đồng7 gold badges110 silver badges123 bronze badges

Nếu bạn chỉ tước không gian tên và muốn bất cứ thứ gì sau \ cuối cùng trong một tên lớp có không gian tên (hoặc chỉ tên nếu không có '\'), bạn có thể làm điều gì đó như thế này:

$classNameWithNamespace=get_class($this);
return substr($classNameWithNamespace, strrpos($classNameWithNamespace, '\\')+1);
1

Về cơ bản, Regex là có bất kỳ sự kết hợp nào của các ký tự hoặc dấu gạch chéo ngược và cho đến lần chéo ngược cuối cùng sau đó chỉ trả lại các ký tự không trở lại và cho đến khi kết thúc chuỗi. Thêm? Sau khi nhóm đầu tiên có nghĩa là nếu khớp mẫu không tồn tại, nó chỉ trả về chuỗi đầy đủ.

Đã trả lời ngày 13 tháng 3 năm 2017 lúc 21:29Mar 13, 2017 at 21:29

ScottscottScott

7.9132 Huy hiệu vàng23 Huy hiệu bạc41 Huy hiệu đồng2 gold badges23 silver badges41 bronze badges

Bởi vì "ReflectionClass" có thể là phiên bản phụ thuộc chỉ sử dụng phần sau:

$classNameWithNamespace=get_class($this);
return substr($classNameWithNamespace, strrpos($classNameWithNamespace, '\\')+1);
2

hoặc thậm chí rõ ràng

$classNameWithNamespace=get_class($this);
return substr($classNameWithNamespace, strrpos($classNameWithNamespace, '\\')+1);
3

Đã trả lời ngày 11 tháng 10 năm 2019 lúc 13:10Oct 11, 2019 at 13:10

1

Nhanh nhất mà tôi tìm thấy ở đây cho

return substr(strrchr(get_class($this), '\\'), 1);
6 trên
return substr(strrchr(get_class($this), '\\'), 1);
7

$classNameWithNamespace=get_class($this);
return substr($classNameWithNamespace, strrpos($classNameWithNamespace, '\\')+1);
4

Đã trả lời ngày 18 tháng 5 năm 2020 lúc 22:36May 18, 2020 at 22:36

Chỉ là chức năng nhỏ của tôi mà từ tất cả các điểm chuẩn chạy nhanh nhất trên máy Mac của tôi với Php 8.1.6. Hàm này xử lý các tình huống khi chuỗi được cung cấp trống hoặc không có bất kỳ không gian tên nào (không chứa ký tự

return substr(strrchr(get_class($this), '\\'), 1);
8 bên trong).

$classNameWithNamespace=get_class($this);
return substr($classNameWithNamespace, strrpos($classNameWithNamespace, '\\')+1);
5

Điểm chuẩn (lớp không có không gian tên hoặc

return substr(strrchr(get_class($this), '\\'), 1);
8):

$classNameWithNamespace=get_class($this);
return substr($classNameWithNamespace, strrpos($classNameWithNamespace, '\\')+1);
6

Điểm chuẩn (không gian tên đầy đủ):

$classNameWithNamespace=get_class($this);
return substr($classNameWithNamespace, strrpos($classNameWithNamespace, '\\')+1);
7

Đã trả lời ngày 25 tháng 5 lúc 9:29May 25 at 9:29

1

Làm thế nào để có được tên lớp mà không có không gian tên PHP?

Bạn có thể sử dụng ReflectionClass :: GetShortName có tên của lớp mà không có không gian tên của nó.ReflectionClass::getShortName which get name of the class without its namespace.

Làm gì :: Lớp làm trong PHP?

Someclass :: class sẽ trả lại tên đủ điều kiện của someclass bao gồm cả không gian tên.Tính năng này đã được thực hiện trong Php 5.5.Nó rất hữu ích cho 2 lý do.Bạn có thể sử dụng từ khóa sử dụng để giải quyết lớp của mình và bạn không cần phải viết tên lớp đầy đủ.return the fully qualified name of SomeClass including the namespace. This feature was implemented in PHP 5.5. It's very useful for 2 reasons. You can use the use keyword to resolve your class and you don't need to write the full class name.

Làm thế nào để tôi tìm thấy thể hiện của một đối tượng trong PHP?

PHP |Get_Class () Chức năng Trả về Giá trị: Hàm này trả về tên lớp mà đối tượng là một thể hiện.Nó trả về sai nếu đối tượng không phải là một đối tượng.Nếu đối tượng bị bỏ qua khi bên trong lớp thì tên lớp được trả về.$ obj = new gfg ();get_class() Function Return Value: This function returns the class name of which object is an instance. It returns FALSE if the object is not an object. If the object is omitted when inside the class then the class name is returned. $obj = new GFG();

Ví dụ về một ví dụ trong PHP là gì?

Từ khóa InstanceOf được sử dụng để kiểm tra xem một đối tượng thuộc về một lớp.Việc so sánh trả về đúng nếu đối tượng là một thể hiện của lớp, nó sẽ trả về sai nếu không.used to check if an object belongs to a class. The comparison returns true if the object is an instance of the class, it returns false if it is not.