Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
Страницы: (2) [1] 2  ( Перейти к первому непрочитанному сообщению )  
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Разница между self и $this в классах
Astin  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 1 год, 5 месяцев, 12 дней
Карма: 7




Приветствую форумчане!

Для меня все время было непонятным разница между self и $this в классах.
Ну и вот решил немного разобраться и сделал для себя небольшой примерчик

Первый пример
class Set
{
public function con()
{
echo 'Привет';
}

public function bon()
{
return self::con().self::don();
}

public function don()
{
echo ' - т';
}
}


Мой вывод: В данном случае есть возможность вызвать метод bon()
двумя способами
Set::bon();

и если создать объект класса
$gets = new Set();

$gets->bon();


И вот у меня такой вопрос по этому поводу:
Можно ли так вообще использовать self для вызова одного метода в другом?


Пример второй
class Set
{
public function con()
{
echo 'Привет';
}

public function bon()
{
return $this->con().$this->don();
}

public function don()
{
echo ' - т';
}

}


Во втором примере нельзя вызвать метод bon() как статистический.
его можно вызвать только создав объект класса.

Ну и пока что еще разбираюсь дальше что к чему, но очень буду рад если кто
что то еще пояснит по тому поводу



PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
N0ob  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 800
Пользователь №: 37078
На форуме: 4 года, 3 месяца, 21 день
Карма: 13




$this - это вызов обычного свойства класса.
self - вызов статического свойства

class test
{
public static $var = "Hello";

public static function pnt()
{
return self::$var;
}
}


echo test::pnt();
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Astin  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 1 год, 5 месяцев, 12 дней
Карма: 7




Ну так мне это понятно что self - вызов статического свойства
Меня вот что интересует
Цитата
Можно ли так вообще использовать self для вызова одного метода в другом?

Я этот вопрос выше писал про первый пример
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
N0ob  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 800
Пользователь №: 37078
На форуме: 4 года, 3 месяца, 21 день
Карма: 13




Цитата
Мой вывод: В данном случае есть возможность вызвать метод bon()
двумя способами
Set::bon();


и если создать объект класса
$gets = new Set();

$gets->bon();


Неправильный вывод. Первый вариант не сработает, т.к. метод не является статическим.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
N0ob  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 800
Пользователь №: 37078
На форуме: 4 года, 3 месяца, 21 день
Карма: 13




 public function bon()
{
return self::con().self::don();
}


Так же ошибка, т.к. con and don тоже не являются статическими
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Astin  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 1 год, 5 месяцев, 12 дней
Карма: 7




У меня не вызывает ошибки

Без разницы если я пропишу public static или вот так public

Ну и тогда назревает еще вопрос, если я использую self для вызова одного
метода в другом, то что, получается функция должна быть не просто public, а
public static?

Хотя первый пример у меня не вызывает ошибки
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
N0ob  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 800
Пользователь №: 37078
На форуме: 4 года, 3 месяца, 21 день
Карма: 13




похоже я уже отбился от языка. Нужно срочно шуровать в мануал
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Astin  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 1 год, 5 месяцев, 12 дней
Карма: 7




Мануал это конечно хорошо, но еслиб все было понятно в нем я скорее
всего бы не спрашивал. А так честно уже подустал перечитывать одно и то же чтоб
понять точно что к чему. Наверно пойду и еще раз почитаю
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sg.com  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Местный житель
****

Профиль
Группа: Пользователь
Сообщений: 159
Пользователь №: 42899
На форуме: 1 год, 2 месяца, 25 дней
Карма: 3




Перевод одной из ошибок в первом варианте (еще две присутствуют)
Цитата
Строгие стандарты: Номера для статического метода::Бон() не должен вызываться статически


во втором - без ошибок. (php 5.6)

Это сообщение отредактировал sg.com - 26.06.2016 - 20:59
PMПисьмо на e-mail пользователю
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Astin  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 1 год, 5 месяцев, 12 дней
Карма: 7




Цитата
Перевод одной из ошибок в первом варианте (еще две присутствуют)

Ну так покажи на ошибки чтоб понятней было.

И еще, если это неправильно почему же тогда не вызывает ошибки?

Я так понимаю если вызывать один метод в другом используя self то функции
должны быть не просто public, а public static. Ну это я так понимаю.
Вот пример из мануала
class A {
public static function who() {
echo __CLASS__;
}
public static function test() {
self::who();
}
}


PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Astin  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 1 год, 5 месяцев, 12 дней
Карма: 7




Цитата
Перевод одной из ошибок в первом варианте (еще две присутствуют)
Цитата
Строгие стандарты: Номера для статического метода::Бон() не должен вызываться статически

sg.com и все же соглашусь с тобой.

Сейчас поставил в скрипт
ini_set("display_errors", 1);
error_reporting(-1);

Смотрю и да, все три ошибки указывают на то что ты написал.

Короче если я вызываю один метод внутри другого через self то оба эти
метода должны быть статичными, то есть public static
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sg.com  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Местный житель
****

Профиль
Группа: Пользователь
Сообщений: 159
Пользователь №: 42899
На форуме: 1 год, 2 месяца, 25 дней
Карма: 3




да, к статическим свойствам и методам через конструкцию self::, к динамическим через - $this->
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Astin  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 1 год, 5 месяцев, 12 дней
Карма: 7




А вот еще есть вопрос: Как правильно пользоваться __autoload
Читаю мануал, смотрю примеры и нихрена не врублюсь...

Вот даже взять за пример PHPMailer, там в Автолоаде написано первыми строками
function PHPMailerAutoload($classname)
{
//Can't use __DIR__ as it's only in PHP 5.3+
$filename = dirname(__FILE__).DIRECTORY_SEPARATOR.'class.'.strtolower($classname).'.php';
if (is_readable($filename)) {
require $filename;
}
}


Для того чтоб заработал PHPMailer нужно просто подключить автолоад и
создать объект класса
require '../PHPMailerAutoload.php';
$mail = new PHPMailer(true);


Так вот, как загружает автоматически если в переменной $classname ничего нет.

Кто нибудь может привести простенький пример с автолоадом

_



PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Astin  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 1 год, 5 месяцев, 12 дней
Карма: 7




А, вот врубился про __autoload

Получается он автомвтом распознает какой класс подключить, но только
если после подключения файла автолоада объявишь объект класса или
вызовешь класс ститечески
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
killer8080  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 8972
Пользователь №: 26630
На форуме: 6 лет, 4 месяца, 22 дня
Карма: 611




Цитата (Astin @ 26.06.2016 - 21:40)
А вот еще есть вопрос: Как правильно пользоваться __autoload
Читаю мануал, смотрю примеры и нихрена не врублюсь...

Вот даже взять за пример PHPMailer, там в Автолоаде написано первыми строками
function PHPMailerAutoload($classname)
{
    //Can't use __DIR__ as it's only in PHP 5.3+
    $filename = dirname(__FILE__).DIRECTORY_SEPARATOR.'class.'.strtolower($classname).'.php';
    if (is_readable($filename)) {
        require $filename;
    }
}


Для того чтоб заработал PHPMailer нужно просто подключить автолоад и
создать объект класса
require '../PHPMailerAutoload.php';
$mail = new PHPMailer(true);


Так вот, как загружает автоматически если в переменной $classname ничего нет.

Кто нибудь может привести простенький пример с автолоадом
PMПисьмо на e-mail пользователю
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темыСтраницы: (2) [1] 2  Ответ в темуСоздание новой темыСоздание опроса