Здравствуйте. Ситуация следующая. Например есть класс: Код (Text): class User { private static $instance = null; public static function getInstance(){ if(null == self::$instance){ self::$instance = new self(); } return self::$instance; } и его "подкласс" с методом "login": Код (Text): class User_Authentication extends User { public function login($login,$password){ } } Далее в тексте кода я создаю объект класс USER: Код (Text): $USER = User::getInstance(); Вопрос в том, как сделать так, чтобы можно было обращаться с методу "login" прямо из объекта $USER ($USER->login()), при этом явно не создавая объект ($USER=User_Authentication::getInstance()) и не объединяя два класса в один, представленные выше. Заранее, спасибо
Про классы, наследование, интерфейсы - читал уже много раз. Может, конечно, что-то упустил. Попробую прочитать статью по Вашей ссылке.
bobroff вы напишите, что вы хотите сделать и что для этого придумали. судя по первому посту вы идете не совсем верным путем.
Я хочу создать библиотеку управления юзерами, но не сваливать все в кучу, а сделать: 1. Общий класс USER; 2. Подкласс для регистрации User_Register; 3. Подкласс для авторизации User_Login; При этом, методы всех классов и подклассов должны вызываться через один объект $USER;
Сделай наоборот. Делаем основной класс "пользователь абстрактный" (AbstractUser) - с основными свойствами пользователя, геттерами сеттерами этих свойств. Некие стандартные методы. От него наследует класс "пользователь регистрирующийся" (UserRegister) - реализация методов регистрации и прочих ближних к этому От него наследует класс "пользователь логинищийся" (UserLogin)... и т.д. В конце иерархии стоит класс User. Который ничего не реализует, но все наследует. И чтобы не было искушения создать калеченого пользователя объявляем все классы кроме User абстрактными.
Еще можно вот так извратится: PHP: <?php $newClass="class User{ "; $newClass.=file_get_contents("Register.php"); $newClass.=file_get_contents("Login.php"); $newClass.=" }"; eval($newClass); $us=new A(); $us->register(); $us->login();?> Но это уже для души, а не как не для реальной работы.
А в чем смысл? Это целых! два метода. Ты хочешь их раздергать по разным классам? Оставь их в одном классе. Лучше сделай отдельный класс авторизации, примерно вот так http://framework.zend.com/manual/en/zend.auth.html
Тогда класс USER раздуется до неимоверных размеров, от чего я как раз стараюсь уйти, разделив его на операции разного типа. Методы я привел для примера, естественно их будет заметно больше. За ссылку спасибо, изучу.
Не думаю, что у вас там будет столько методов, что класс можно будет назвать большим. Но если не хотите... Хотите базовый класс USER? И два наследника? Так используйте два объекта, что за блажь в использовании одного $USER? Пробуйте, как считаете нужным, со временем осознаете, как лучше.
Стоп. Задача в том чтобы разделить методы класса на группы? Или в том чтобы подгружать только необходимые методы? В первом случае вполне подходит мой алгоритм, ибо user.php будет выглядеть так: PHP: <?php require_once("finalUser.php"); class user extends finalUser{} ?> А для второго случая надо курить в сторону __call() и динамически подгружать нужные функции/классы. Нечто вроде: PHP: <?php function __call($name, $arguments){ switch ($name) { case "login": reqire_once(UserLogin.php); $login = new UserLogin($this); $login->login($arguments); .... } ?> Но я не верю, что это настолько тяжелые классы, чтобы было необходимо думать о подгрузке не всего кода.