php self что это

Типы данных в PHP: self и parent

PHP self означает объект того же типа ( текущего класса или подкласса ). Для каждой переменной должно выполняться условие instanceof по отношению к текущему классу.

Использование в качестве аргумента функции

Бывает необходимо спроектировать связь между объектами одного типа. В данном случае тип self может быть полезен.
Когда мы создаем реализацию этого интерфейса ( или рефакторим код без соблюдения SOLID принципов ) следует заменить тип self оригинальным названием класса или интерфейса:

Использование в качестве типа возвращаемого значения

Давайте разберемся, в каких ситуациях можно использовать new self PHP в качестве типа возвращаемого значения.

Сеттеры

Один из самых очевидных примеров использования — это сеттеры ( или мутаторы ) с возможностью сцепления ( chaining ):

При расширении или реализации метода в дочернем классе необходимо явно указать тип, чтобы объявление было совместимым:

Фабричные методы

Нелегко найти пример метода, который не является сеттером и возвращает объект того же класса. Но вот он:

Реализация будет выглядеть так:

parent

Документация PHP говорит, что parent допустимый тип данных. Давайте разберемся, что он из себя представляет:

В данном случае parent не может указывать на интерфейс. И схема работы примерна такая же, когда вы вызываете метод родительского класса ( parent::setBar например ). Другими словами, parent можно использовать только тогда, когда текущий класс расширяет какой-то другой класс.

Есть несколько причин, почему тип parent не используется:

Дайте знать, что вы думаете по этой теме статьи в комментариях. За комментарии, подписки, лайки, отклики, дизлайки низкий вам поклон!

Источник

Позднее статическое связывание — PHP: Погружаясь в классы

Подобное поведение можно рассматривать как ограничение. Фактически оно игнорирует факт наследования. Позднее связывание же открывает доступ к некоторым возможностям, которые широко эксплуатируются в некоторых других языках, таких как Ruby. Прежде чем вдаваться в технические детали, нужно немного разобраться с тем, какую роль играют статические свойства и методы в классах.

Данные в статических свойствах относятся к классу в целом. Они «описывают» его. Самый распространённый пример из веба — это связь сущности с таблицей в базе данных, где она хранится:

Почему эту информацию нужно хранить в статическом свойстве? Потому что она не принадлежит конкретному объекту. Представьте, что вы просто хотите узнать из кода, в какую таблицу будут сохраняться пользователи. Если бы эта информация не была статической, то пришлось бы создавать объект только ради того, чтобы узнать ответ на наш вопрос. Это бессмысленно.

Для сохранения сущности в базу данных обычно используются библиотеки ORM (Object-Relationship Mapping), которые, в том числе, знают, как сохранять сущности в базу и как извлечь их. Большинство из них построено на наследовании. Любая сущность должна наследоваться от специального базового класса, который содержит в себе общую логику для работы с базой данных:

Для сохранения пользователя в базу, недостаточно знать, что сохранять, нужно ещё понимать, куда сохранять. И эта информация записана в статическое свойство.

Источник

Позднее статическое связывание в PHP (Часть I)

php self что это. Смотреть фото php self что это. Смотреть картинку php self что это. Картинка про php self что это. Фото php self что этоПозднее Статическое Связывание (Late Static Binding, LSB) является бурно темой обсуждений последние три года в кругах разработчиков PHP (и наконец мы его получили в PHP 5.3). Но зачем оно нужно? В данной статье, как раз и будет рассматриваться, как позднее статическое связывание может значительно упростить ваш код.

На встрече разработчиков PHP, которая проходила в Париже в ноябре 2005 года, тема позднего статического связывания официально обсуждалась основной командой разработчиков. Они согласились реализовать его, наряду со многими другими темами, которые стояли на повестке дня. Детали должны были быть согласованы в ходе открытых дискуссий.

С тех пор как позднее статическое связывание было объявлено как грядущая фишка, прошло два года. И вот наконец LSB стало доступно для использования в PHP 5.3. Но это событие прошло незаметно для разработчиков использующих PHP, из заметок только страничка в мануале.

Если кратко, новая функциональность позднего статического связывания, позволяет объектам все также наследовать методы у родительских классов, но помимо этого дает возможность унаследованным методам иметь доступ к статическим константам, методам и свойствам класса потомка, а не только родительского класса. Давайте рассмотрим пример:

Этот код выдаст такой результат:

Класс Ale унаследовал метод getName(), но при этом self все еще указывает на класс в котором оно используется (в данном случае это класс Beer). Это осталось и в PHP 5.3, но добавилось слово static. И снова рассмотрим пример:

Новое ключевое слово static указывает, что необходимо использовать константу унаследованного класса, вместо константы которая была определена в классе где объявлен метод getStaticName(). Слово static было добавлено, чтобы реализовать новый функционал, а для обратной совместимости self работает также как и в предыдущих версиях PHP.

Внутренне, основное отличие (и, собственно, причина почему связывание назвали поздним) между этими двумя способами доступа, в том, что PHP определят значение для self::NAME во время «компиляции» (когда симовлы PHP преобразуются в машинный код, который будет обрабатываться движком Zend), а для static::NAME значение будет определено в момент запуска (в тот момент, когда машинный код будет выполнятся в движке Zend).

Это еще один инструмент для PHP-разработчиков. Во второй части рассмотрим как его можно использовать во благо.

Источник

ЗлостныйКодер

Программирование, Алгоритмы, С++, C#, Java, Python и другие вещи

четверг, 19 декабря 2013 г.

php self что это. Смотреть фото php self что это. Смотреть картинку php self что это. Картинка про php self что это. Фото php self что это

Обычна нужна, чтобы инициализировать поля в конструкторе, ну и не только:

$self используется в том, же самом ключе, но уже для СТАТИЧЕСКИХ свойств:

Результат:
self::STAT: S
self::$stat: Static
Strict Standards: Accessing static property Klass::$stat as non static in htdocs\test\testReference.php on line ..
Notice: Undefined property: Klass::$stat in C:\xampp\htdocs\test\testReference.php on line 50
$this->stat:
$this->publ: Public
Видно, что php умный и кидает предупреждения глупым программистам. Не делайте так.

Второе главное отличие состоит в том, что

self не использует таблицу виртуальных методов, то есть:
(взято с StackOverflow)

Hello, I’m Ludwig the geek
Goodbye from Ludwig the person

Пояснение:
Метод sayHello использует this, поэтому виртуальная таблица вызовет Geek::getTitle()
Метод sayGoodbye использует self, поэтому виртуальная таблица будет не задействована и будет вызван parent::getTitle()

Решение:
Используем вместо self, static keyword:
public function sayGoodbye() <
echo «Goodbye from «. static::getTitle() ;

Источник

Php self что это

I have implemented enum using late static binding.

interface IEnum <
/**
* Only concrete class should implement this function that should behave as
* an enum.
*
* This method should return the __CLASS__ constant property of that class
*
* @return string __CLASS__
*/
public static function who ();
>

abstract class Enum <

// use of late static binding to get the class.
$class = static:: who ();

class Fruits extends Enum implements IEnum <

public static function who () <
return __CLASS__ ;
>
>

// user input from dropdown menu of fruits list
$input = 3 ;

echo B :: constructor (); // B
?>

Just a quick reminder to always check your syntax. While I love LSB, I thought it wasn’t working:

static::$sKey = not set

…until I realized that I’d completely forgotten to make it a variable variable:

static::$$sKey = is set

…of course this applies anywhere in PHP, but because of the (current) newness late static bindings, I’ve seen lots of code with this particular snafu in it from others.

In the above example (#3) in order to make it work, you can change the child’s method from ‘private’ to ‘protected’ (or public) and it will be called through ‘static’.

class B extends A <
/* foo() will be copied to B, hence its scope will still be A and
* the call be successful */
>

class C extends A <
protected function foo () < //note the change here
echo ‘hello world!’ ;
>
>

I discovered an interesting thing. The class name string must be accessed directly from «flat» variable. Late static binding code that get’s it’s variable from array that is passed by class instance, throws an syntax error. Bug?

public static function numbers ()
<
return 123 ;
>

$arr = array( ‘class’ => ‘A’ );

This function can be used as a workaround for late static binding in PHP >= 5.1.0. There was another similar version of this function elsewhere, but used eval.

At least as of PHP 5.3.0a2 there’s a function get_called_class(), which returns the class on which the static method is called.

class a <
static public function test () <
print get_called_class ();
>
>

a :: test (); // «a»
b :: test (); // «b»

You can pass arguments to your constructor through your getInstance method, assuming you are running php5.

This would pass the params to your constructor. Love for php.

PHP5.3 unavailable, yet in the need for ‘static’, I did the following.

Any objections? Personally I hate using the the eval() statement.

Here is a small workaround I made for the static inheritance issue. It’s not perfect, but it works.

// Init
$backTrace = debug_backtrace ();
$class = false ;

public static function staticClassName () <
// Get real name
$staticName = self :: getStatic ();

?>

There are two issues with this workaround :
— if you call a static method from global env, you need to declare the name of the class BEFORE calling the method, otherwise the workaround won’t work (see 3rd and 4th examples). But I assume good programming makes few calls to static methods from global scope, so this shouldn’t be long to fix if you use it.
— the workaround fails to access to private or protected static vars, as it uses get_class_vars(). If you find any better solution, let us know.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *