Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Нюансы ООП. Разница между __CLASS__ и ::class


Автор: PsiMagistr 23.1.2017, 13:14
Ребята, у меня возник один нюанс, который не могу уразуметь... Волшебные константы.

Какова разница между  магическими константами __CLASS__ и ::class. Насколько я понимаю обе хранят полное имя класса с пространствами имен. http://php.net/manual/ru/language.oop5.basic.php#language.oop5.basic.class.class  




Вот некоторый код (рабочий) (PHP 7)

Код


abstract class Model{

       public static function findById($id){  
      
        $db = Db::getInstance();
        return $db->query('SELECT * FROM '.static::TABLE.' WHERE id = :id', static::class, [':id' => $id])[0];     
        
    }
}



Попытка замены static::class на static::__CLASS__ ведет к ошибке...


Доролнено на более простом коде:

Код

class A{
    public static function R(){
        echo static::class; //Работает.
    }
    
}


class B extends A{
    
}

B::R();


Работает...

Код

class A{
    public static function R(){
        echo static::__CLASS__; //Ошибка.
    }
    
}


class B extends A{
    
}

B::R();


Ошибка.

Автор: Vardoulacha 23.1.2017, 15:14
http://php.net/manual/ru/language.constants.predefined.php

Код

<?php
class A{
    public static function R(){
        echo '__CLASS__ != static::class<br>';
        echo __CLASS__ . ' != ' . static::class;
    }

}
class B extends A{

}
B::R();


__CLASS__ != static::class
A != B

Автор: PsiMagistr 23.1.2017, 15:44
Цитата(Vardoulacha @ 23.1.2017,  15:14)
__CLASS__ != static::class
A != B

Спасибо большое.

Я уловил, что это не тождество. А можно ли вызвать __CLASS__ не у предка, а у наследника?

Автор: Vardoulacha 23.1.2017, 15:53
__CLASS__ для того и нужен чтобы получить имя ТОГО КЛАССА ГДЕ СТОИТ ЭТА СТРОКА
для всего остального есть ::class

MyClass::class
static::class
MySuperClass::class

Автор: PsiMagistr 23.1.2017, 16:07
Цитата(Vardoulacha @ 23.1.2017,  15:53)
__CLASS__ для того и нужен чтобы получить имя ТОГО КЛАССА ГДЕ СТОИТ ЭТА СТРОКА
для всего остального есть ::class

MyClass::class
static::class
MySuperClass::class

Просто япортирую проект с PHP 7 на PHP 5.4. А у него нет константы class.

Автор: _zorn_ 24.1.2017, 20:14
Цитата(PsiMagistr @  23.1.2017,  23:07 Найти цитируемый пост)
Просто япортирую проект с PHP 7 на PHP 5.4. А у него нет константы class. 

Обычно наоборот... короче не завидуем тебе чувак. Сам разгребай.
Может проще подтянуть проект до современных стандартов ?

Автор: Fortop 24.1.2017, 21:05
Цитата(PsiMagistr @ 23.1.2017,  16:07)

Просто япортирую проект с PHP 7 на PHP 5.4. А у него нет константы class.

Не делай этого 

Автор: PsiMagistr 24.1.2017, 21:46
На современных стандартах все работает. Я ж не виноват, что хостер на php 5.4 гоняет. В поддержку написал - там руками развели.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)