показывает ли var_dump() свойства класса?

#php #class #var-dump

#php #класс #var-дамп

Вопрос:

Если я использую var_dump для какого-либо класса, скажем DateTime :

 <?php

$date = new DateTime();

var_dump($date);
 

Я получил

 /var/www/php/test/index.php:5:
object(DateTime)[1]
  public 'date' => string '2021-02-16 23:23:10.768097' (length=26)
  public 'timezone_type' => int 3
  public 'timezone' => string 'Europe/Berlin' (length=13)
 

Как я понимаю, существует 3 общедоступных свойства. Поэтому я пытаюсь получить к ним доступ:

 <?php

$date = new DateTime();

var_dump($date);

//example of accessing public $date; of class DateTime;
echo $date->date;
 

но я получил Undefined property: DateTime::$date in /var/www/php/test/index.php on line 7

Итак, как я должен интерпретировать var_dump(some class) ?

Комментарии:

1. Какую версию PHP вы используете? Какая у вас операционная система? Я запускаю PHP 7.3.24 из командной строки и echo $date->date показывает 2021-02-16 22:36:17.973299

2. php 7.4.9. 5.8.0-43-generic #49-Ubuntu SMP Пт 5 февраля 03:01:28 UTC 2021 x86_64 x86_64 x86_64 GNU /Linux

Ответ №1:

var_dump() показывает как общедоступные, так и частные свойства.

Для PHP до версии 7.3 date было общедоступным свойством DateTime.

Из PHP 7.4 date является частной собственностью, и попытка получить к ней доступ возвращает Undefined property сообщение.

Смотрите https://3v4l.org/MW498

Обратите внимание, что эти свойства не задокументированы в руководстве по PHP для DateTime, поэтому все, что вы делаете с ними, может сломаться без предварительного уведомления.

Комментарии:

1. итак, почему var_dump показывает его как общедоступный, если он частный?

2. или var_dump показывает более старую версию DateClass?

3. У меня нет ответа на это, кроме как заметить, что встроенные функции и классы PHP не всегда подчиняются тем же правилам, которым подчиняются классы и функции, написанные на PHP.

4. Не могли бы вы уточнить свое утверждение «встроенная функция не подчиняется, как это делают классы / функции»? Я думал, что есть один стандарт php, который диктует семантику как для встроенных, так и для остальных (класс, функция). Или я ошибаюсь?

5. PHP начал свою жизнь как набор PERL-скриптов. Сейчас это в основном (полностью?) написан на C , и переход не всегда был таким дисциплинированным, как мог бы быть. Вот почему у нас есть огромное количество функций с иногда противоречивыми соглашениями об именовании и списками параметров. (подумайте о строковых функциях как о примере несогласованности именования). PHP 7 и PHP 8 прошли долгий путь к очистке act. more…