Я PHP-программист, пытающийся больше узнать о теории PHP, но у меня возникают проблемы с определением точек соприкосновения между PHP и C. Например, точно ли оператор стрелки в PHP и C?
Вот что я придумал, когда исследовал это:
-> это просто псевдоним, a->b совпадает с (*a).b. Оператор стрелки просто разыменовывает указатель, поэтому вы взаимодействуете с адресной переменной.-> является ссылкой. Он «ссылается на атрибуты созданного объекта» (неизвестно). Но это то же самое, что и C?Note: Today, I learned what pointers are in C.






В PHP -> используется для доступа к членам класса. C не имеет классов.
Самое близкое это struct.
В PHP
class Animal {
public $color;
public $age;
}
$fido = new Animal;
$fido->color = 'white';
$fido->age = 3;
$kitty = new Animal;
$kitty->color = 'brown';
$kitty->age = 5;
// output
echo 'Fido is ' . $fido->color . "age = ". $fido->age . "\n";
echo 'Kitty is ' . $kitty->color . "age = ". $kitty->age . "\n";
Выход:
Fido is white age=3
Kitty is brown age=5
Вы можете сделать что-то подобное в C, используя структуры. Это немного сложнее.
Извините за мой C. Он довольно ржавый
struct Animal {
int age;
char color[50];
};
int size = sizeof(struct Animal);
struct Animal * fido = malloc(size);
struct Animal * kitty = malloc(size);
fido->age = 3;
strcpy(fido->color, "white");
kitty->age = 5;
strcpy(kitty->color, "brown");
printf("Fido is %s age=%d\n", fido->color, fido->age);
printf("Kitty is %s age=%d\n", kitty->color, fido->age);
Если вы действительно не хотите углубляться в основные детали, не переусердствуйте со ссылками на PHP. Это означает, что они не передают фактические значения при выполнении вызовов функций и т. д.
Ах, отсутствие классов C было поучительным. Я думаю, что понял, но я действительно хочу, чтобы узнать о «основных деталях». Еще раз спасибо @ryantxr!
Затем начните копаться в исходном коде PHP. :) Счастливых приключений.
В php стрелка -> используется для доступа к функции класса.
class A{
function funA(){
return "Hello World";
}
}
$object1 = new A();
$object1->funA;
Объект будет
Hello World
Вы также можете получить доступ к вложенным объектам с помощью оператора стрелки в PHP.
Мы преобразуем строку в объект. Вот моя строка:
{
"id":"123456",
"msg":"Have a Nice Day",
"is_active":false,
"total_count":1
}
ЕСЛИ я закодирую его в JSON
$obj = json_decode($json, false);
Я могу легко получить значение объекта с помощью оператора ->
$obj->msg;
Выход будет
Have a Nice Day
Вы можете сделать то же самое в C, используя структуры.
Спасибо @РахатХамид. Тем не менее, мой главный вопрос касался основных процессов оператора стрелки PHP.
Вы не можете сделать $object1 = new funA(); в PHP, если имя класса — A. Я думаю, вы имели в виду new A().
@ryantxr Да, вы правы, я ошибся при наборе текста.
Не пытайтесь слишком усердно искать эквивалентность между двумя языками. Их семантика просто слишком различна, так что это не удастся.
Тем не менее, оператор разыменования -> в PHP, вероятно, был выбран, чтобы визуально напоминать оператор доступа к члену -> в C, и семантика в чем-то схожа, поскольку оба позволяют получить доступ к члену разыменованного объекта.
Я не уверен, что вы подразумеваете под «в C -> — это просто псевдоним»: язык C имеет a понятие «псевдоним», но это совершенно не связано с обсуждаемой темой.
Скорее, -> является оператор, а выражение 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 не выделяется в куче.
В PHP -> похож на то, как вы обращаетесь к элементу
structв C.