Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   переопределение констант (https://javascript.ru/forum/offtopic/14067-pereopredelenie-konstant.html)

x-yuri 27.12.2010 13:54

переопределение констант
 
ну так давно узнал, что в php можно переопределять константы классов :)
class A { const A = 1; }
class B { const A = 2; }
echo B::A;


так вот по сравнению с fortran php отдыхает. Там можно писать в литералы константы (баг называется constants aren't):
Код:

  PROGRAM MYSTERY
      CALL MAGIC(1)
C    !!! Prints 12
      PRINT *, 'According to the computer, 3 + 1 is ', ADDUP(3, 1)
      END

      FUNCTION ADDUP(I, J)
      ADDUP = I + J
      END

C    What does this subroutine actually do?
      SUBROUTINE MAGIC(I)
      I = 9
      RETURN

      END

я только не уверен, во всех ли реализациях. Может только в той, что от ms
The __fortran calling convention isn't the calling convention used by FORTRAN

x-yuri 10.07.2012 12:02

а сейчас наткнулся на то, что в perl 4 было то же самое:

Код:

    $foo = "x";
    &mod($foo);
    for ($x = 0; $x < 3; $x++) {
        &mod("a");
    }
    sub mod {
        print "before: $_[0]";
        $_[0] = "m";
        print "  after: $_[0]\n";
    }
    # perl4:
    # before: x  after: m
    # before: a  after: m
    # before: m  after: m
    # before: m  after: m

http://perldoc.perl.org/perltrap.html

vasa_c 10.07.2012 12:09

определили константу в A, определили константу в B.
A::A при этом осталась, как и была.
к переопределению констант это не имеет никакого отношения.

x-yuri 12.07.2012 18:52

я там extends A пропустил: class B extends A { const A = 2; }. Далее, если я пишу self::A:
class C extends B { function f() {
    var_dump(self::A);
}}

я получу, B::A. Почему? Правильно, потому что класс B переопределил константу А.

devote 12.07.2012 19:23

Цитата:

Сообщение от x-yuri
я получу, B::A. Почему? Правильно, потому что класс B переопределил константу А.

никто ничего не переопределил. Просто у A есть своя константа у B своя. А при обращении к self::A ты получаешь ссылку на класс B поэтому и получаешь его константу, но при этом обратившись к A::A получишь нормальную константу класса A.

Так работает во всех языках программирования, и это не переопределение.

x-yuri 12.07.2012 23:57

ok, расскажите мне, что такое переопределение

dmitriymar 13.07.2012 01:16

http://ru.wikipedia.org/wiki/%D0%9F%...BE%D0%B4%D0%B0
x-yuri, прав, хотя до этого был согласен с devote, во многих источниках переопределение -упоминается изменение изменяющее родительское в контексте родительского .

devote 13.07.2012 01:20

Цитата:

Сообщение от x-yuri
ok, расскажите мне, что такое переопределение

ну я может не правильно выразился. Но константа в классах, это по большей части static свойство. И считать переопределением статические свойства в классах по моему не уместно.

x-yuri 13.07.2012 12:53

Цитата:

Сообщение от devote
это по большей части static свойство. И считать переопределением статические свойства в классах по моему не уместно.

в принципе да, хотя если взять тот же lsb...


Часовой пояс GMT +3, время: 10:37.