Оператор стрелки в PHP против C

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

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

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

Note: Today, I learned what pointers are in C.

В PHP -> похож на то, как вы обращаетесь к элементу struct в C.

ryantxr 17.05.2019 06:34
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
1
132
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

Chris Happy 17.05.2019 20:16

Затем начните копаться в исходном коде PHP. :) Счастливых приключений.

ryantxr 17.05.2019 21:32

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

Chris Happy 17.05.2019 20:11

Вы не можете сделать $object1 = new funA(); в PHP, если имя класса — A. Я думаю, вы имели в виду new A().

ryantxr 17.05.2019 21:37

@ryantxr Да, вы правы, я ошибся при наборе текста.

Rahat Hameed 20.05.2019 12:32

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

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

Другие вопросы по теме