В чем отличие class от простого зборища функций?

Crazy

Developer
Автор оригинала: Yamamoto
функция - это не форма данных
Ok. Расскажи, please, в чем состоит твоя трактовка термина "форма данных". :)

я даже не буду ничего больше писать
Это будет так обидно и жестоко...

так как Вы очень плоско и банально все воспринимаете, без обид:)
Ответ неверный. Верный ответ: я с юмором воспринимаю даже самые плоские и бесполезные определения. :)
 

гоша

Guest
> Того, что ООП в PHP не содержит инкапсуляции как понятия.

Всё это очень хорошо согласуется с упоминанием лиспов, хаскеллов и прочих умных слов.

"инкапсуляция" -- не более чем способ, элемент стиля программирования. Заявление, "язык не содержит инкапсуляции" так же глупо, как "язык не содержит отступов".

Писать программы с инкапсуляцией на пхп никто вам не запрещает (на это, кстати, уже намекнули выше).
 

Crazy

Developer
Автор оригинала: IntenT
Что в твоем понимании инкапсуляция?
Я предпочитаю стандартное понимание, согласно которому инкапсуляция состоит в сокрытии деталей внутренней структуры объекта.
 

PhpGuest

Guest
классы в php 4 сплошное недоразумение :(

а инкапсуляция это вроде как обьединение полей и методов просто вроде было а не сокрытие?
 

Crazy

Developer
Автор оригинала: гоша
Писать программы с инкапсуляцией на пхп никто вам не запрещает (на это, кстати, уже намекнули выше).
Вот простой класс на Java, в котором используется инкапсуляция атрибутов x и y, благодаря чему снаружи ничего не известно об их использовании и нет риска, что кто-то напишет "foo.x = 10", которое перестанет работать после изменения внутренней структуры класса.

Код:
public class Foo {

  private int x;
  private int y;

  public Foo() {
    x = 1;
    y = 2;
  }

  public int getZ() {
    return x+y;
  }

}
Вот как это пишется на PHP без инкапсуляции:

Код:
class Foo {

  var $x;
  var $y;

  function Foo() {
    $this->x = 1;
    $this->y = 2;
  }

  function getZ() {
    return $this->x+$this->y;
  }

}
Нетрудно видеть, что в этом случае мы не имеем технической возможности ограничить доступ к $x и $y. Ты утверждаешь, что инкапсуляция в PHP есть. Прекрасно. Покажи, как переписать этот исходник, чтобы инкспсуляция была.

-~{}~ 12.02.04 18:05:

Автор оригинала: Alexos
и ещё насчёт полиморфизма.. плиз..
есть ли он в PHP?
Говорить о полиморфизме в языках без строгой типизации несколько некорректно. Но если закрыть на это глаза, то ответ будет таким: "более чем есть". :)

-~{}~ 12.02.04 18:07:

Автор оригинала: PhpGuest
классы в php 4 сплошное недоразумение :(
Тем не менее, PHP4 есть объективная реальность, данная нам в ощущении. И я всерьез полагаю, что при открытии треда имелась в виду именно четвертая версия.

а инкапсуляция это вроде как обьединение полей и методов просто вроде было а не сокрытие?
Объединение называется умным словом "агрегация". :)
 

PhpGuest

Guest
Объединение называется умным словом "агрегация". :)

агрегация - это вроде как частный случай инкапсуляции - когда поля в виде обьектов представлены

(ты наверное идеологию жабы проповедуешь? :)
 

Линк

Guest
Crazy, а в определении инкапуляции есть фраза о том что доступа "не должно быть ФИЗИЧЕСКИ"? тоесть если я просто не буду лазить в некоторые св-ва объекта, просто потому что знаю что этого не надо делать - это не будет инкапсуляцией?
 

Verk

Guest
Автор оригинала: Crazy
Покажи, как переписать этот исходник, чтобы инкспсуляция была.
PHP:
class Foo {
  //private
  var $x;
  //private
  var $y;

  function Foo() {
    $this->x = 1;
    $this->y = 2;
  }

  function getZ() {
    return $this->x+$this->y;
  }
}
 

гоша

Guest
Crazy

ты видимо не очень понял мою реплику. Код:

class Foo { var $x; var $y; function Foo() { $this->x = 1; $this->y = 2; } function getZ() { return $this->x+$this->y; }}

перепиши его, чтобы отступы были :)

Еще раз: "инкапсуляция" -- элемент СТИЛЯ программирования (не только объектного). В некоторых языках имеются синтаксические средства, облегчающие (поощряющие) то или иной стилистический прием. Например, синтаксис С++ облегчает инкапсуляцию, синтаксис лиспа - рекурсию, а синтаксис питона -- красивые отступы.

Отсутствие в пхп названных синтаксических средств НЕ означает, что этими приемами пользоваться нельзя.

Verk

именно это я и хотел сказать. Я лично предпочитаю:

PHP:
  //private 
  var $_x; 
  //private 
  var $_y;
 

Crazy

Developer
Автор оригинала: Verk
PHP:
class Foo {
  //private
  var $x;
Проверяем:

PHP:
$foo  = new Foo();
$foo->x = 100;
echo $foo->x;
Убеждаемся, что:

1. PHP не ругается.
2. Значение атрибута меняется.

Вывод: в PHP инкапсуляции нет. Курсив хорошо заметно?
 

PhpGuest

Guest
Автор оригинала: Verk
PHP:
class Foo {
  //private
  var $x;
  //private
  var $y;

  function Foo() {
    $this->x = 1;
    $this->y = 2;
  }

  function getZ() {
    return $this->x+$this->y;
  }
}
Я где то видел что приватные поля условно начинают знаком _
 

IntenT

SkyDiver
Линк
Почитай ссылку, которую я дал.
Кажется там именно то, что имел в виду Crazy
 

tony2001

TeaM PHPClub
PhpGuest
>классы в php 4 сплошное недоразумение
>а инкапсуляция это вроде как обьединение полей и методов просто вроде было а не сокрытие?
эх, знать бы еще что такое классы, а то как бы эти "рассуждения" не оказались недоразумением..
 

Crazy

Developer
Автор оригинала: гоша
Отсутствие в пхп названных синтаксических средств НЕ означает, что этими приемами пользоваться нельзя.
Возвращаемся к моей фразе:

ООП в PHP не содержит инкапсуляции как понятия
Здесь ничего не сказано о допустимости использования тех или иных приемов или соглашений. Смысл фразы вполне конкретный: в PHP инкапсуляции нет. Равно как нет классов в Plain C. Что точно так же не препятствует написанию объектных программ на Plain C.
 

Crazy

Developer
Автор оригинала: Verk
Это мне напомнило фразу "У нас секса нет".
Я так понимаю, что возражения по существу вопроса исчерпаны? :)

Резюме: утверждение "в PHP есть инкапсуляция" истинно в той же степени, что и следующие:

1. В языке C есть классы.
2. Запорожец может развить скорость 1000 км/ч.
 
Сверху