Помощник
|
Совмещение статического и объектного использования классов |
PRStudio
|
Сообщение
#1
|
||
|
|
||
|
|||
Witu |
17.9.2012, 7:16;
Ответить: Witu
Сообщение
#2
|
|
ошибка вылезет
|
|
|
Arks |
17.9.2012, 8:24;
Ответить: Arks
Сообщение
#3
|
|
Ахаха, доступ и статически и объектно))) улыбнули. Никогда не пробовали написать
[PHP] class A { public static function iAmStatic() { echo 'OK'; } } $a = new A; $a->iAmStatic(); [/PHP] ? Так вот - это называется г****код Так как вы хотите не программируют, у Вас каша в голове видимо. Опишите цель велосипедизма и Вам предложат решение. Для доступа к объектным методам, может я покажусь банальным, но используют объекты, а не статические методы. А для доступа к статическим методам обычно не пишут так как я написал выше. Все просто. |
|
|
PRStudio
|
Сообщение
#4
|
|
Arks , вы неверно поняли меня.
Предположим, есть класс MyClass, в котором есть метод method. Данный класс должен работать как при MyClass::method() так и $myClass->method(), все бы ничего, но метод должен затронуть статическое свойство, но данное свойство должно оставаться внутри объекта и быть независимым от класса, но само объявление ее как статической привязывает ее к классу, и как не вызывай и не создавай объектов, объект не получит независимое свойство, а будет использовать уже привязанное к классу. Наверно хорошим примером будет класс Database, котороый может может использоваться как Database::connect() так и $database->connect(), где все красиво работает, и все свойства объекта не зависят от класса. Я хочу сохранить совместимость некоторых классов, чтобы их методы можно было бы вызвать как статически, так и через объект, при этом методы сохраняют свойства, а при статике, если изменится MyClass::$var то и $class->var получит это же значение, чего и хотелось бы избежать. Свойство объекта должно остаться свойством объекта. Быть может есть способ выловить, был ли вызван метод через объект класса, или напрямую? |
|
|
Arks |
17.9.2012, 20:40;
Ответить: Arks
Сообщение
#5
|
|
А кто мешает инкапсулировать объекты внутри статической фабрики и хоть обвызываться потом их методов? В БД - то что написали скорее всего синглтон, т.е. по сути имеется один статический метод MyClass::method() и внутри класса имеется статическое свойство - ссылка на закрытый экземпляр этого класса. Таким образом и MyClass::method() и его алиас $myClass->method() всегда приводят к
MyClass::$instance->privateMethod(func_get_args()); или типа того. Понятно написал или не очень? Вот разъяснение [PHP] <?php class MyClass { private static $instance = NULL; private $property; public static function method() { if(self::$instance === NULL) { self::$instance = new self; } self::$instance->innerMethod(); } private function innerMethod() { $this->property = '123'; } } MyClass::method()// MyClass->new instance->innerMethod new MyClass()->method() //MyClass::method()->MyClass->new instance->innerMethod ?> [/PHP] Только так не пишут потому что это бред для 99% задач и используется совсем в других ситуациях чем Вы описали. И я пытаюсь до Вас донести что статический метод и нестатический это два разных метода и в моем примере выше от того что метод был вызван через объект - нестатическим он от этого все равно не стал, это просто допущение в синтаксисе php. Если очень хочется сделать статический метод реально перегруженным нестатическим(да php тоже так умеет(через костыли правда :rolleyes:)! java'овцы - съели?!:goodpost:) - используйте __call и __callStatic чтобы избежать конфликта имен, разумеется при этом оба метода в классе не объявляются. А вообще узнать все позволяет ReflectionAPI http://docs.php.net/Reflection, в том числе и вызывать методы как левой пятке вздумается и контролировать аргументы. метод должен затронуть статическое свойство, но данное свойство должно оставаться внутри объекта и быть независимым от класса сам то понял что написал? :rjunimagu:
|
|
|
PRStudio
|
Сообщение
#6
|
|
|
|
|
Arks |
18.9.2012, 21:56;
Ответить: Arks
Сообщение
#7
|
|
перечитайте Мэтта Зандстру пару раз. Его книга по профиту равна примерно 3 годам программирования. Или, как вариант, попрограммируйте на java. После java(и в частности generics) простота php покажется манной небесной.
|
|
|
Alcorn |
19.9.2012, 13:40;
Ответить: Alcorn
Сообщение
#8
|
|
Или, как вариант, попрограммируйте на java. После java(и в частности generics) простота php покажется манной небесной. Да и не только java, C# мне кажется намного продвинутей, чем java (как язык). Есть только один минус - после всего этого есть соблазн больше не вернуться в PHP. |
|
|
Arks |
19.9.2012, 14:02;
Ответить: Arks
Сообщение
#9
|
|
Странный соблазн. Это же разные языки. Разумеется сейчас на php никто десктопные программы не пишет, и наоборот ASP или C# для web тянет за собой обычно сервер с IIS и всеми вытекающими, по копеечке за лицензию - и Вы уже банкрот.
Да, шарп пожалуй действительно более продвинутый, делегаты, биндинги и т.п. Но начинать лучше с java т.к. в ней более каноническая структура кодинга, нет разных Using(.Net.A) { ... } и есть много видов коллекций с разными методами доступа в отличие от шарповских перечисляемых типов с доступом через for(type v in C). Ну и т.д. |
|
|
Alcorn |
19.9.2012, 18:43;
Ответить: Alcorn
Сообщение
#10
|
|
Arks, вспомнилось: баг-репорт, почему в java нельзя делать switch case по стрингам, 1995-ый год - http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=1223179, спустя 16 лет в java 7 разработчики добавили эту возможность. Собственно это и характеризует данный язык - строгая консервативность, никаких новшеств. C# же наоборот, MS каждый год клепают новые возможности языка, причём сам язык довольно молодой, а уже столько наклепали, что java и не снилось. Я рассматриваю C# именно как язык, без привязки к винде, IIS и прочему, только сама реализация. А насчёт работы с коллекциями, есть тот же LINQ к примеру, с sql-подобным синтаксисом. Просто сам синтаксис языка как-то более приятен.
Отступление от темы - простейший пример, поиск в списке интовых значений больше 5-ти и вывод их на html-страницу без всяких foreach, одна строка кода - [PHP]Response.Write(String.Join(", ", (new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }).Where(item => item > 5))); // получаем - 6, 7, 8, 9, 10[/PHP] условия вывода естественно можно менять, то же самое на linq - [PHP]Response.Write(String.Join(", ", from item in (new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }) where item > 5 select item)); // получаем - 6, 7, 8, 9, 10[/PHP] Мне кажется делегаты, лямбды (ну и linq) выглядят вполне приемлимым новвоведением в C#, причём язык всё развивается и развивается, а не топчется на месте десятилетиями. |
|
|
|
Похожие темы
Тема | Ответов | Автор | Просмотров | Последний ответ | |
---|---|---|---|---|---|
In-to.cc - Простота использования, быстрая скорость обмена, индивидуальный подход к каждому пользователю, самые популярные направления обмена. | 2 | in_to | 2310 | 13.3.2023, 14:15 автор: in_to |
|
Где купить хороший сайт для личного использования | 3 | Nina WMaster | 1407 | 6.7.2016, 6:22 автор: Nina WMaster |
|
Требуется разработка дизайна + верстка для статического сайта | 2 | ShowPrint | 1246 | 31.3.2015, 21:42 автор: ShowPrint |
|
Совмещение Адсенс и партнерки AdInfo | 3 | JannyCouper | 1120 | 9.3.2015, 18:03 автор: Sosnovskij |
|
PHP Программист (возможно совмещение с учебой) СПб | 3 | kolosova | 3681 | 6.9.2008, 23:38 автор: -Merlin- |
Текстовая версия | Сейчас: 25.4.2024, 12:30 |