X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

2 страниц V   1 2 >
Открыть тему
Тема закрыта
> Совмещение статического и объектного использования классов
PRStudio
PRStudio
Topic Starter сообщение 16.9.2012, 23:00; Ответить: PRStudio
Сообщение #1


Интересует вопрос, возможно ли так описать класс, чтобы его можно было бы использовать и статически и объектно, т.е. Class::method() и $class->method(). Основная загвоздка в том, что в случае со статическим вызовом, все свойства описаны статически и принадлежат классу, поэтому вызов Class::method() повлияет и на $Class->method(). В общем, может имеются некие магические функции для отлова, был ли класс инстанцирован или вызван статически. Уже думал пошаманить над конструктором, но так или иначе, все опять сводится к статическим свойствам.

[PHP]Class A
{
private $var; // Требуется доступ и статически, и объектно
// Но если задать статически и изменить, то изменения повлияют и на объект класса
}[/PHP]

Пример:
[PHP]Class A
{
private static $var = "I want to be called as object";
public static function method($new){
self::$var = $new;
}
public static function get(){
echo self::$var."\n";
}
}

A::method("Static call");
A::get(); // Static call
$a = new A();
$a->get(); // Хотелось бы увидеть "I want to be called as object"[/PHP]
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Witu
Witu
сообщение 17.9.2012, 7:16; Ответить: Witu
Сообщение #2


ошибка вылезет
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Arks
Arks
сообщение 17.9.2012, 8:24; Ответить: Arks
Сообщение #3


Ахаха, доступ и статически и объектно))) улыбнули. Никогда не пробовали написать

[PHP]
class A {
public static function iAmStatic() {
echo 'OK';
}
}

$a = new A;
$a->iAmStatic();
[/PHP]
? Так вот - это называется г****код

Так как вы хотите не программируют, у Вас каша в голове видимо. Опишите цель велосипедизма и Вам предложат решение.
Для доступа к объектным методам, может я покажусь банальным, но используют объекты, а не статические методы. А для доступа к статическим методам обычно не пишут так как я написал выше. Все просто.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
PRStudio
PRStudio
Topic Starter сообщение 17.9.2012, 17:43; Ответить: PRStudio
Сообщение #4


Arks , вы неверно поняли меня.

Предположим, есть класс MyClass, в котором есть метод method. Данный класс должен работать как при MyClass::method() так и $myClass->method(), все бы ничего, но метод должен затронуть статическое свойство, но данное свойство должно оставаться внутри объекта и быть независимым от класса, но само объявление ее как статической привязывает ее к классу, и как не вызывай и не создавай объектов, объект не получит независимое свойство, а будет использовать уже привязанное к классу.

Наверно хорошим примером будет класс Database, котороый может может использоваться как Database::connect() так и $database->connect(), где все красиво работает, и все свойства объекта не зависят от класса.

Я хочу сохранить совместимость некоторых классов, чтобы их методы можно было бы вызвать как статически, так и через объект, при этом методы сохраняют свойства, а при статике, если изменится MyClass::$var то и $class->var получит это же значение, чего и хотелось бы избежать. Свойство объекта должно остаться свойством объекта. Быть может есть способ выловить, был ли вызван метод через объект класса, или напрямую?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Arks
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
PRStudio
Topic Starter сообщение 17.9.2012, 22:35; Ответить: PRStudio
Сообщение #6


(Arks @ 17.9.2012, 23:40) *
Понятно написал или не очень

Да, книжечка с паттернами лежит, и думаю пора ее перечитать :)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Arks
Arks
сообщение 18.9.2012, 21:56; Ответить: Arks
Сообщение #7


перечитайте Мэтта Зандстру пару раз. Его книга по профиту равна примерно 3 годам программирования. Или, как вариант, попрограммируйте на java. После java(и в частности generics) простота php покажется манной небесной.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Alcorn
Alcorn
сообщение 19.9.2012, 13:40; Ответить: Alcorn
Сообщение #8


(Arks @ 19.9.2012, 00:56) *
Или, как вариант, попрограммируйте на java. После java(и в частности generics) простота php покажется манной небесной.


Да и не только java, C# мне кажется намного продвинутей, чем java (как язык). Есть только один минус - после всего этого есть соблазн больше не вернуться в PHP.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Arks
Arks
сообщение 19.9.2012, 14:02; Ответить: Arks
Сообщение #9


Странный соблазн. Это же разные языки. Разумеется сейчас на php никто десктопные программы не пишет, и наоборот ASP или C# для web тянет за собой обычно сервер с IIS и всеми вытекающими, по копеечке за лицензию - и Вы уже банкрот.
Да, шарп пожалуй действительно более продвинутый, делегаты, биндинги и т.п. Но начинать лучше с java т.к. в ней более каноническая структура кодинга, нет разных Using(.Net.A) { ... } и есть много видов коллекций с разными методами доступа в отличие от шарповских перечисляемых типов с доступом через for(type v in C). Ну и т.д.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Alcorn
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#, причём язык всё развивается и развивается, а не топчется на месте десятилетиями.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
2 страниц V   1 2 >
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) 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-


 



RSS Текстовая версия Сейчас: 25.4.2024, 12:30
Дизайн