Heim Backend-Entwicklung PHP-Tutorial PHP继承方法获取子类名讲解_PHP教程

PHP继承方法获取子类名讲解_PHP教程

Jul 13, 2016 pm 05:42 PM
datastore mvc php einmal 入门 Start 方式 方法 von 类名 继承 获取 讲解 verwenden

看了一下datastore的入门,以及开始采用MVC方式来写php,于是想拿php为redis写个model,可以实现一些datastore的基本功能...于是碰到这样一个问题-.-
php里__CLASS__这类东西是静态绑定的,如果不再子类里重载的话,那么继承父类方法所得到的依旧是父类的名称而不是子类的名称。比如:
class A{
        function __construct(){
                echo __CLASS__;
        }
        static function name(){
                echo __CLASS__;
        }
}
class B extends A{}

此时无论将B实例化还是直接调用静态方法,echo出来的都会是A。翻qeephp里是用子类重载的方式解决这个问题,可是这样的话没新搞一个子类就得把相应调用类名的方法重载一边.....这算是php在oop上的缺陷吧,试了试python上没这个问题。
google之。找到两个函数get_class()和get_called_class()。get_class()用于实例调用,加入参数 ($this)可解决子类继承调用的问题,而get_called_class()则是用于静态方法调用,可是...这玩意儿只在php 5.3以后才有....5.3还是比较遥远的事...还好5.2之前可以手动实现这个函数:参阅http://php.net/manual/en /function.get-called-class.php 下方有高手添加了几种5.3之前的实现方式。

if(!function_exists(get_called_class)) {
class class_tools
{
        private static $i = 0;
        private static $fl = null;
        public static function get_called_class()
        {
                $bt = debug_backtrace();
                //使用call_user_func或call_user_func_array函数调用类方法,处理如下
                if (array_key_exists(3, $bt) && array_key_exists(function, $bt[3]) && in_array($bt[3][function], array(call_user_func, call_user_func_array))
) {
                                //如果参数是数组
                                if (is_array($bt[3][args][0])) {
                                $toret = $bt[3][args][0][0];
                                return $toret;
                }else if(is_string($bt[3][args][0])) {//如果参数是字符串
                        //如果是字符串且字符串中包含::符号,则认为是正确的参数类型,计算并返回类名
                        if(false !== strpos($bt[3][args][0], ::)) {
                                $toret = explode(::, $bt[3][args][0]);
                                return $toret[0];
                        }
                }
        }
        //使用正常途径调用类方法,如:A::make()
        if(self::$fl == $bt[2][file].$bt[2][line]) {
                self::$i ;
        } else {
                self::$i = 0;
                self::$fl = $bt[2][file].$bt[2][line];
        }
        $lines = file($bt[2][file]);
        preg_match_all(/([a-zA-Z0-9\_] )::.$bt[2][function]./,$lines[$bt[2][line]-1],$matches);
        return $matches[1][self::$i];
        }
        }
        function get_called_class()
        {
                return class_tools::get_called_class();
        }
}

于是现在可以把例子这么修改:
class A{
        function __construct(){
                echo get_class($this);
        }
        static function name(){
                echo get_called_class();
        }
}
class B extends A{}
这样就能让B直接顺利继承获取当前类名的方法了~

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/486064.htmlTechArticle看了一下datastore的入门,以及开始采用MVC方式来写php,于是想拿php为redis写个model,可以实现一些datastore的基本功能...于是碰到这样一个问题...
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße Artikel -Tags

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian

CakePHP Datum und Uhrzeit CakePHP Datum und Uhrzeit Sep 10, 2024 pm 05:27 PM

CakePHP Datum und Uhrzeit

CakePHP-Projektkonfiguration CakePHP-Projektkonfiguration Sep 10, 2024 pm 05:25 PM

CakePHP-Projektkonfiguration

CakePHP-Datei hochladen CakePHP-Datei hochladen Sep 10, 2024 pm 05:27 PM

CakePHP-Datei hochladen

CakePHP-Routing CakePHP-Routing Sep 10, 2024 pm 05:25 PM

CakePHP-Routing

Besprechen Sie CakePHP Besprechen Sie CakePHP Sep 10, 2024 pm 05:28 PM

Besprechen Sie CakePHP

CakePHP-Kurzanleitung CakePHP-Kurzanleitung Sep 10, 2024 pm 05:27 PM

CakePHP-Kurzanleitung

So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein Dec 20, 2024 am 11:31 AM

So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein

See all articles