конструкция this

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Ответить
Антон
Сообщения: 199
Зарегистрирован: 2013.08.29, 05:27
Откуда: Харьков

конструкция this

Сообщение Антон »

Никогда не понимал функцию такого вида.

Код: Выделить всё

function one(a,b){
    $this->a=a;
    $this->b=b;
}
 
Объясните вообще для чего это используется?
Аватара пользователя
SiZE
Сообщения: 2817
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: конструкция this

Сообщение SiZE »

Антон писал(а):Объясните вообще для чего это используется?
Притянутый за уши пример. Никто так не делает. А если кто и делает, то это скорее исключение, присваивать в одном методе несколько переменных.
Аватара пользователя
Barssoft
Сообщения: 726
Зарегистрирован: 2013.01.21, 16:03

Re: конструкция this

Сообщение Barssoft »

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

Код: Выделить всё

Class retro {
  private $retrolend;
public function setRetrolend($params){
   $this->retrolend = $params;
}

}
 
Та как создав объект класса где нибудь вне класса вы не сможете поменять приватную переменную, то и делают публичные функции для ее смены, и далее объект это класса будет использоваться уже с присвоенной вами переменной, то есть все методы и атрибуты класса зависящие от переменной понесут изменения... Но вот зачем делать переменную приватной, а потом ей передавать значение через публичную функцию я сам не знаю, и было бы круто, если бы кто то тут написал пример когда такое делать просто необходимо, иначе будет ошибка.
wolandino
Сообщения: 103
Зарегистрирован: 2011.02.02, 20:03

Re: конструкция this

Сообщение wolandino »

Но вот зачем делать переменную приватной, а потом ей передавать значение через публичную функцию я сам не знаю, и было бы круто, если бы кто то тут написал пример когда такое делать просто необходимо, иначе будет ошибка.
Есть несколько примеров в книге у Sam Dark. Например, когда нужно сделать какую-то переменной доступной только для чтения, а какую-то только для записи:

Код: Выделить всё

class MyClass extends CComponent
{
private $read = 'read only property';
private $write = 'write only property';
public function getRead()
{
return $this->read;
}
public function setWrite($value)
{
$this->write = $value;
}
}
$object = new MyClass();
// gives us an error since we are trying to write to read-only
property
$object->read = 'value';
// echoes 'read only property'
echo $object->read;
// gives us an error since we are trying to read to write-only
property
echo $object->write;
// writes 'value' to private $write
$object->write = 'value';
NEW_NAME
Сообщения: 216
Зарегистрирован: 2013.07.15, 09:52

Re: конструкция this

Сообщение NEW_NAME »

Та как создав объект класса где нибудь вне класса вы не сможете поменять приватную переменную, то и делают публичные функции для ее смены, и далее объект это класса будет использоваться уже с присвоенной вами переменной, то есть все методы и атрибуты класса зависящие от переменной понесут изменения... Но вот зачем делать переменную приватной, а потом ей передавать значение через публичную функцию я сам не знаю, и было бы круто, если бы кто то тут написал пример когда такое делать просто необходимо, иначе будет ошибка.
Принципы ООП же. Пример слишком простой. Но суть в том, что в идеале публичных переменных быть не должно, ты как бы общаешься с объектом. Говоришь ему что-то сделать, и его внутреннее устройство волновать не должно, а должен быть какой-то интерфейс для общения. Геттеров, сеттеров естественно в идеале быть тоже не должно.
Аватара пользователя
Barssoft
Сообщения: 726
Зарегистрирован: 2013.01.21, 16:03

Re: конструкция this

Сообщение Barssoft »

Пример для меня внес понимания, а вот на счет того чтоб управлять объектом только с помощью методов, может это и правильно, но как то не гибко, подходит только для специализированных вещей каких то, а если нужно чтоб объект был настраиваемым, и не только выполнял действия, но и принимал параметры, взаимодействовал как то с другими объектами, как быть то, если объект не будет принимать в параметров
Аватара пользователя
nizsheanez
Сообщения: 814
Зарегистрирован: 2011.04.29, 13:09
Откуда: Москва

Re: конструкция this

Сообщение nizsheanez »

объект будет принимать, но как он устроен(какие у него есть свойства и настройки подтянутые из конфига) желательно не знать.
NEW_NAME
Сообщения: 216
Зарегистрирован: 2013.07.15, 09:52

Re: конструкция this

Сообщение NEW_NAME »

Пример для меня внес понимания, а вот на счет того чтоб управлять объектом только с помощью методов, может это и правильно, но как то не гибко, подходит только для специализированных вещей каких то, а если нужно чтоб объект был настраиваемым, и не только выполнял действия, но и принимал параметры, взаимодействовал как то с другими объектами, как быть то, если объект не будет принимать в параметров
Я же писал "в идеале". То есть например собаке говоришь "к ноге", и тебе не нужно двигать самому ее лапы, или давать команды вроде "правую переднюю лапу поставить по такой то ширине долготе, левую заднюю...".
Например тот же актив рекорд это как бы еще и структура данных, и было бы невозможно использовать инкапсулировав все переменные. Или например обсчет матриц каких-нибудь: глупо терять в скорости и простоте кода, спрятав значения самой матрицы.
Аватара пользователя
Barssoft
Сообщения: 726
Зарегистрирован: 2013.01.21, 16:03

Re: конструкция this

Сообщение Barssoft »

Спасибо понятно... Еще есть вот такой вопрос, есть статичные функции, подскажите где почитать отличие, на http://www.php.su/ не нашел понятного ответа на этот вопрос, так же не понимаю что такое абстрактный класс, и чем отличается от обычного
Аватара пользователя
Barssoft
Сообщения: 726
Зарегистрирован: 2013.01.21, 16:03

Re: конструкция this

Сообщение Barssoft »

Нашел ссылку про абстрактные классы и интерфейсы, не раз попадал на неверные суждения, прошу более опытных товарищей пояснить, правдивы ли там разъяснения http://www.askdev.ru/php/6981/%D0%97%D0 ... %81%D1%8B/
wolandino
Сообщения: 103
Зарегистрирован: 2011.02.02, 20:03

Re: конструкция this

Сообщение wolandino »

На мой взгляд очень здорово расписано
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: конструкция this

Сообщение slavcodev »

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

Абстрактные классы - это классы, объект которого ты не можешь создать, по причине что класс требует уточнения (обычно это абстрактные методы). Эти уточнения идут в конкретных классах.

Например, класс автомобиля. Мы не можем создать объект автомобиля, т.к. машина должны быть какой-то определенной марки (в программах где это важно, в других программах конечно может быть где есть машина неважно кеакой марки). Поэтому мы можем иметь общий, абстрактный класс Car, реализует общие методы (startEngine(), changeOil()) и конкретные классы, которые реализуют специфичные методы (напр., Mercedes:: getBrend(), getBrendLogo()).

В Yii такой абстрактный класс можно считать ActiveRecord. Он не абстрактный только из-за тонкостей реализации, т.к. с абстрактными классами невозможно работать в коде, только наследоваться от них, а в yii мы юзаем ActiveRecord::model($class) для инициализации конкретных моделей.

Интерфейсы - это набор методов которые должны обязательно повторять соответствующие объекты. Возможно видна анлогия с абстрактным классом, но в интерфейсах нельзя реализовывать что либо, только определения методов. Учитывая что класс может иметь несколько интерфейсов, интерфейсы можно делить на более мелкие и точные, для гибкости.

Например в php у нас есть ArrayAccess и Countable, казалось бы как массив не имеет количество элементов, но метод count() вынесли в отдельный интерфейс, т.к. есть и другие классы которые имеют количество, но не являются массивами.

Пример интерфейсов. Один и тот же класс может использоваться в разных частях программы, но в этих разных частях нужны разные методы. Тот же Mercedes, имеем разные части программы: мастерская и поездка по городу. В одном используется интерфейс (changeOil(), changeFilters()) в другом (startEngine($driver), turnWheel($degree))
Интерфейсы очень важныв true OOP, где рекомендуется работать только через интерфейса. Т.е. ты заводишь машину через $car->startEngine($driver) а не $car->key = $driver->key, потому что через определенное время приходит век машин где нет ключей, нужно нажать кнопочку, при этом по у водителя в кармане должен быть чип. Тогда не надо рефакторить весь код, нужно только изменить поведение startEngine($driver)
Жду Yii 3!
wolandino
Сообщения: 103
Зарегистрирован: 2011.02.02, 20:03

Re: конструкция this

Сообщение wolandino »

Я бы добавил еще то, что пишут во всех учебниках:
1) в php нет множественного наследования, но имплементировать несколько интерфейсов можно
2) интерфейс не может содержать никакой реализации, никакого кода (об этом писали выше)
3) класс должен реализовывать внутри себя все методы, описанные в интерфейсе (об этом писали выше)
Антон
Сообщения: 199
Зарегистрирован: 2013.08.29, 05:27
Откуда: Харьков

Re: конструкция this

Сообщение Антон »

А вот если у меня 2 функции в классе

Код: Выделить всё

privare a;
function one{
}

function two{
}
 
То можно передавать переменную из одной функции в другую.
Аватара пользователя
solo
Сообщения: 320
Зарегистрирован: 2013.03.08, 19:59
Откуда: Ukraine, VINNITSA

Re: конструкция this

Сообщение solo »

Во-первых не функции а методы.
Во-вторых есть атрибуты для этого.
В-третьих конструкция метода:

Код: Выделить всё

private function name(){} 
Ответить