Я создаю класс пользователя для своего нового веб-сайта, однако на этот раз я подумал о том, чтобы создать его немного по-другому ...
C ++ , Java и даже Ruby (и, возможно, другие языки программирования) позволяют использовать вложенные / внутренние классы внутри основного класса, что позволяет нам сделать код более объектно-ориентированным и организованным.
В PHP я бы хотел сделать что-то вроде этого:
<?php
public class User {
public $userid;
public $username;
private $password;
public class UserProfile {
// some code here
}
private class UserHistory {
// some code here
}
}
?>
Возможно ли это в PHP? Как я могу этого добиться?
ОБНОВИТЬ
Если это невозможно, будут ли будущие версии PHP поддерживать вложенные классы?
User
, например:public class UserProfile extends User
иpublic class UserHestory extends User
.Ответы:
Вступление:
Вложенные классы относятся к другим классам немного иначе, чем внешние классы. Возьмем Java в качестве примера:
Нестатические вложенные классы имеют доступ к другим членам включающего класса, даже если они объявлены закрытыми. Кроме того, нестатические вложенные классы требуют создания экземпляра родительского класса.
Для их использования есть несколько веских причин:
В PHP
Вы можете иметь аналогичное поведение в PHP без вложенных классов.
Если все, что вы хотите достичь, это структура / организация, как Package.OuterClass.InnerClass, пространств имен PHP может быть достаточно. Вы даже можете объявить более одного пространства имен в одном файле (хотя из-за стандартных функций автозагрузки это может быть нежелательно).
Если вы хотите подражать другим характеристикам, таким как видимость участников, потребуется немного больше усилий.
Определение класса "пакет"
Пример использования
Тестирование
Вывод:
НОТА:
Я действительно не думаю, что попытка эмуляции innerClasses в PHP - такая хорошая идея. Я думаю, что код менее чистый и читаемый. Кроме того, вероятно, есть другие способы достижения аналогичных результатов с использованием хорошо зарекомендовавшего себя шаблона, такого как шаблон Observer, Decorator или COmposition. Иногда достаточно даже простого наследования.
источник
Реальные вложенные классы с
public
/protected
/private
доступностью были предложены в 2013 году для PHP 5.6 в качестве RFC, но не сделали этого (пока нет голосования, нет обновлений с 2013 года - по состоянию на 2016/12/29 ):https://wiki.php.net/rfc/nested_classes
По крайней мере, анонимные классы вошли в PHP 7
https://wiki.php.net/rfc/anonymous_classes
На этой странице RFC:
Итак, в какой-то будущей версии мы можем получить вложенные классы, но это еще не решено.
источник
Вы не можете сделать это в PHP. Однако есть функциональные способы добиться этого.
Для получения более подробной информации, пожалуйста, проверьте этот пост: Как создать вложенный класс PHP или вложенные методы?
Такой способ реализации называется свободным интерфейсом: http://en.wikipedia.org/wiki/Fluent_interface
источник
Начиная с версии PHP 5.4 вы можете принудительно создавать объекты с частным конструктором через отражение. Его можно использовать для моделирования вложенных классов Java. Пример кода:
источник
Согласно комментарию Xenon к ответу Анила Озелгина, анонимные классы были реализованы в PHP 7.0, который настолько близок к вложенным классам, насколько вы можете получить прямо сейчас. Вот соответствующие RFC:
Вложенные классы (статус: отозван)
Анонимные классы (статус: реализован в PHP 7.0)
Пример к исходному посту, вот как будет выглядеть ваш код:
Однако это имеет очень неприятную оговорку. Если вы используете IDE, такую как PHPStorm или NetBeans, а затем добавляете в
User
класс такой метод :... пока, автозаполнение. Это так, даже если вы кодируете интерфейсы (I в SOLID), используя такой шаблон:
Если только ваши вызовы не
$this->profile
исходят из__construct()
метода (или любого другого метода$this->profile
, определенного в), вы не получите никаких подсказок типа. Ваше свойство по существу «скрыто» для вашей IDE, что очень усложняет жизнь, если вы полагаетесь на свою IDE для автозаполнения, обнаружения запаха кода и рефакторинга.источник
Вы не можете сделать это на PHP. PHP поддерживает "include", но вы не можете сделать это даже внутри определения класса. Здесь не так много хороших вариантов.
Это не дает прямого ответа на ваш вопрос, но вас могут заинтересовать «Пространства имен», ужасно уродливый \ синтаксис \ взломанный \ на \ вершине \ PHP ООП: http://www.php.net/manual/en/language .namespaces.rationale.php
источник
Ожидает голосования как RFC https://wiki.php.net/rfc/anonymous_classes
источник
Думаю, я написал элегантное решение этой проблемы с использованием пространств имен. В моем случае внутреннему классу не нужно знать свой родительский класс (например, статический внутренний класс в Java). В качестве примера я создал класс под названием «Пользователь» и подкласс под названием «Тип», которые используются в качестве справочника для типов пользователей (ADMIN, OTHERS) в моем примере. С уважением.
User.php (файл класса пользователя)
Using.php (пример вызова "подкласса")
источник
Вы можете вот так в PHP 7:
источник
Поместите каждый класс в отдельные файлы и «потребуйте» их.
User.php
UserProfile.php
UserHistory.php
источник