X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

Открыть тему
Тема закрыта
> В чем отличия указателя self от this?
romantik2011
romantik2011
Topic Starter сообщение 27.7.2011, 20:24; Ответить: romantik2011
Сообщение #1


В чем отличия указателя self от this? Что-то не совсем ясно.
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
сообщение 27.7.2011, 21:07; Ответить: alexdrob
Сообщение #2


вот в прошлой теме, вы писали про полиморфизм
а вы там в лкассе А подставьте в функции Call вместо
$this->Test()
self::Test()
будет большая разница)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
romantik2011
romantik2011
Topic Starter сообщение 27.7.2011, 21:14; Ответить: romantik2011
Сообщение #3


Так можно обращаться к статическим методам и свойствам класса без ключевого слова SELF и всё равно интерпретатор не выдаёт ошибок.

будет большая разница)


Ну и какая большая, какой эффект будет?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Apay
Apay
сообщение 27.7.2011, 21:23; Ответить: Apay
Сообщение #4


(romantik2011 @ 28.7.2011, 00:14) *
Ну и какая большая, какой эффект будет?
в одном случае класс, в другом - объект
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
сообщение 27.7.2011, 21:33; Ответить: alexdrob
Сообщение #5


self не только к статическим позволяет обратится.

(romantik2011 @ 28.7.2011, 00:14) *
Ну и какая большая, какой эффект будет?

ну можно создать скрипт и увидеть своими глазами, так будет понятней.

$this - будет ссылаться на тот объект который вызвал событие.
self ссылается на текущий класс, в котором он находится.

то есть
[PHP]class A {
// Выводит, функция какого класса была вызвана
function Test() { echo "Test from A\n"; }
// Тестовая функция — просто переадресует на Test()
function Call() { $this->Test(); }
}

class B extends A {
function Test() { echo "Test from B\n"; }
}

$a=new A();
$b=new B();
$a->Call(); // выводит "Test from A"
$b->Test(); // выводит "Test from B"
$b->Call(); // Внимание! Выводит "Test from B"!
[/PHP]

$b->Call - вызовет функцию B->Test хоть Call находится и в классе A

а в коде ниже
$b->Call - вызовет функцию A->Test, так как self в функции класс А укажет на класс А
[PHP]class A {
// Выводит, функция какого класса была вызвана
function Test() { echo "Test from A\n"; }
// Тестовая функция — просто переадресует на Test()
function Call() { self::Test(); }
}
class B extends A {

function Test() { echo "Test from B\n"; }
}
$a=new A();
$b=new B();
$a->Call(); // выводит "Test from A"
$b->Test(); // выводит "Test from B"
$b->Call(); // Внимание! Выводит "Test from A"![/PHP]
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZhukV
ZhukV
сообщение 27.7.2011, 23:04; Ответить: ZhukV
Сообщение #6


При использовании self не возможно использовать ключевое слово $this
На практике, как оказалось, это достаточно нужная вещь.
1. Иногда нужно все втулить в одну кучу, сразу вариант -- использоания ООП + верного унаследования. Но грузить весь объект (в некоторых слачаях), ради использования одного методы? А если класс огромный?
2. Использования селфов никогда ни приведет к загрузке магических методов.
3. Работает как простая функция, тоесть в конце, память выбрасывается.
4. Используется внутри класса для использования констант задекларированых в этом же классе.

Используя жесткие ссылки между методами класса, можно избавиться от клонирование готовых обектов.

[PHP]
class A{
funciton a(&$a){ return self::b($a); }
function b(&$b){ return self::c($b); }
function c(&$c){ return $c; }
function __construct(){ exit('Error!!!'); }
}

A::a(111);
[/PHP]
С примера видно, что при явной загрузке класса, будет еррор. Используется как простые функции.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
сообщение 27.7.2011, 23:20; Ответить: alexdrob
Сообщение #7


(ZhukV @ 28.7.2011, 02:04) *
A::a(111);

При таком использовании функцию нужно объявлять как static
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZhukV
ZhukV
сообщение 28.7.2011, 1:06; Ответить: ZhukV
Сообщение #8


Можно и не объявлять. Редукатов не будет при жестких ссылках.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
сообщение 28.7.2011, 1:16; Ответить: alexdrob
Сообщение #9


[PHP]<?php

class A{
function a(&$a){ return self::b($a); }
function b(&$b){ return self::c($b); }
function c(&$c){ return $c; }
function __construct(){ exit('Error!!!'); }
}

$a = 111;
A::a($a);[/PHP]
Fatal error: Non-static method A::a() cannot be called statically in D:\Apache\htdocs\1.php on line 11


Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Чем принимать драм или доллар
драм - национальная валюта Армении
2 GigArt 1290 1.4.2022, 19:17
автор: GigArt
Открытая тема (нет новых ответов) Чем монетизировать посетителей без определенной тематики и широким гео?
16 Mansurka 3082 11.7.2021, 15:25
автор: kuprum
Открытая тема (нет новых ответов) Чем просканировать файлы сайта на предмет бэкдоров?
вдруг где-то внутри wp-includes шелл
3 coremission 2148 7.6.2019, 12:41
автор: bekett
Открытая тема (нет новых ответов) Вечные ссылки в статьях дешевле чем на биржах.
3 byleonid 2131 7.3.2019, 11:21
автор: Bizota
Открытая тема (нет новых ответов) Clicklead.ru — больше, чем cpa сеть! гемблинг, беттинг, финансы, нутра, дейтинг, WOW!
4 Clicklead_sf 3386 20.1.2019, 21:53
автор: -Clicklead-


 



RSS Текстовая версия Сейчас: 29.3.2024, 5:20
Дизайн