Не пытайтесь изо всех сил найти эквивалентность между двумя языками. Их семантика просто слишком различна, поэтому это не удастся.
Тем не менее, оператор разыменования ->
в PHP, вероятно, был выбран, чтобы визуально напоминать оператор доступа к элементу ->
в C, и семантика в некоторой степени похожа, так как оба позволяют вам получить доступ к элементу разыменованного объекта .
Я не уверен, что вы подразумеваете под «В C, ->
это просто псевдоним»: язык C имеет понятие «псевдоним» , но это совершенно не связано с данной темой.
Скорее, ->
- это оператор , а выражение a->b
определено эквивалентным (*a).b
, как вы правильно сказали. Но, в отличие от того, что вы сказали, объект не нужно размещать в куче, он может находиться где угодно в памяти. Учтите следующее:
struct foo {
int i;
};
int main(void) {
struct foo f = {42};
struct foo *pf = &f;
printf("f.i = %d\n", pf->i);
}
Здесь pf->i
эквивалентно f.i
(или (*pf).i
). Ни в коем случае i
не выделяется в куче.