Оператор стрелки в PHP против C - PullRequest
3 голосов
/ 17 мая 2019

Я - программист PHP, пытающийся узнать больше о теории PHP, но у меня возникают проблемы с соединением точек между PHP и C. Например, является ли оператор стрелки точно таким же в PHP и C?

Вот что я придумал, когда исследовал это:

  • В C -> - это просто псевдоним , a->b - это то же самое, что (*a).b.Оператор со стрелкой просто разыменовывает указатель, поэтому вы взаимодействуете с переменной адреса.
  • В PHP -> является ссылкой .Он «ссылается на атрибуты экземпляра объекта» (Неизвестно).Но это то же самое, что и C?

Примечание: сегодня я узнал, что такое указатели в C.

Ответы [ 3 ]

1 голос
/ 17 мая 2019

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

Тем не менее, оператор разыменования -> в 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 не выделяется в куче.

1 голос
/ 17 мая 2019

В PHP -> используется для доступа к членам класса. С не имеет классов. Самая близкая вещь это 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. Это означает, что они не передают действительные значения при выполнении вызовов функций и т. Д.

0 голосов
/ 17 мая 2019

В 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;

OutPut будет

Хорошего дня

Вы можете сделать подобное в Си, используя структуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...