[php] вопрос по классам

oleg1331

abstract class A
{
static abstract function afunc;
static function stfunc
{
// здесь нужно как-то вызвать afunc, которая определяется в клссе, происходящем от этого
}
}

class B extends A
{
static function afunc
{
// ...
}
}

мне что-то не приходит в голову, как вообще это можно сделать (пусть даже и криво)... Идеи будут?
Примечание, точное название класса, который наследует A - заранее не известно.

oleg1331

уточняя... мне нужно, чтобы при вызове B::stfunc вызывалась внутри тела функции B::afunc

Maurog

точное название класса, который наследует A - заранее не известно.
придется узнать
зы: я плохо в пхп, но это просто ахтунг. без знания дочернего класса вызывать его метод в интерпретируемом языке с инвалидной поддержкой ООП...
можно завести переменную в классе A, в которую дочерний класс будет записывать свое имя.

class A {
data childName ;
};
class B extends A
{
constructor {
childName = B;
}
}

oleg1331

пришлось жертвовать статикой и насильно добавлять системный метод во второй класс:
abstract class A
{
function func($class = __CLASS__)
{
call_user_func(array($class,'afunc';
}
static abstract function afunc;
}
class B extends A
{
static function afunc
{
echo "Hallo from afunc!<br />";
}
function func($class = __CLASS__)
{
parent::func($class);
}
}
B::func;

это все из-за того, что:
Because static methods are callable without an instance of the object created, the pseudo variable $this is not available inside the method declared as static. In fact static method calls are resolved at compile time. When using an explicit class name the method is already identified completely and no inheritance rules apply. If the call is done by self then self is translated to the current class, that is the class the code belongs to. Here also no inheritance rules apply.

oleg1331

какие конструкторы в статическом классе? Ты чего? В пхп ооп конечно хромает, но не на столько сильно, чтобы в статике еще конструкторы вызывались

Maurog

ах да;)
а слона-то я и не приметил
там статика кругом )

kruzer25

А чем не катит self::afunc в теле a::stfunc?

oleg1331

потому что он будет вызывать именно ту afunc которая определена в классе А. Это происходит из-за того, что при статическом вызове self обозначает именно тот клас, в котором находится вызываемый код, а не тот, который указывается при вызове функции. т.е. при:
class A
{
static func {}
}
class B extend A
{
}

в вызове B::func конструкция self:: в теле func будет обозначать именно класс A, а не класс B. Это как раз написано в цитате, которую я привел выше. А она с документации php.net

kruzer25

Ага, не заметил вторую часть твоей цитаты (прочитал только про то, что нет $this).
А вообще, почему используются именно статические методы? Если пользоваться тут не классами, а объектами - всё отлично работает...

oleg1331

понятно, что с объектами все работает. но у меня не объекты, а именно статические классы.
Вообще, если интересует для чего, эти классы у меня используются для отображения окошек в движке для сайта. Окошко==класс. Поэтому, зачем мне объекты то создавать? Вполне хватает статики.

kruzer25

1) А если тебе потом придётся какие-то данные хранить или несколько одинаковых окошек? Попробуй, кстати, посмотреть на singleton.
2) Извращённо, но работает:
<?
abstract class A {
abstract public static function cfunc;
protected static function afunc($class_name) {
call_user_func(Array($class_name,"cfunc";
}
}

class B extends A {
public static function cfunc {
echo "OK\r\n";
}
public static function afunc {
parent::afunc("B");
}
}

B::afunc;

?>

oleg1331

1) что есть сабж? (можно ссылку сразу на документацию и способы применения?
2) а я такой же вариант уже привел:)

kruzer25

а я такой же вариант уже привел:)
Чёрт, не заметил
что есть сабж?
Ботаем вики

oleg1331

черт, а мне понравилась эта штука И как я без нее раньше жил?

oleg1331

<?php
/**
*
*
* @version $Id$
* @copyright 2007
*/
class A
{
private static $instance;
public $str;
private function __construct
{
$this->str = "class A";
}
public static function singleton
{
if (!isset(self::$instance
{
$cl = __CLASS__;
self::$instance = new $cl;
}
return self::$instance;
}
public function pr
{
echo $this->str."<br />";
}
}
class B extends A
{
private static $instance;
private function __construct
{
$this->str = "class B";
}
public static function singleton
{
if (!isset(self::$instance
{
$cl = __CLASS__;
self::$instance = new $cl;
}
return self::$instance;
}
}
class C extends A
{
private static $instance;
private function __construct
{
$this->str = "class C";
}
public static function singleton
{
if (!isset(self::$instance
{
$cl = __CLASS__;
self::$instance = new $cl;
}
return self::$instance;
}
}
$a = A::singleton;
$b = B::singleton;
$c = C::singleton;
$a->pr;
$b->pr;
$c->pr;
?>

просто хочу быть уверенным - классы А, B и C - абсолютно разные и не пересекаются никак? т.е. у меня есть три $instance (в A, B и С) - три разных объекта, с которыми можно работать независимо.

kruzer25

Сначала скажи, почему классы A и B нельзя сделать абстрактными

oleg1331

хм. а смысл? что нам вообще это даст кроме того, что нельзя будет создавать объекты этих классов? И почему именно A и B? С - ведь тот же самый B, только с другим названием.. Давайте вообще все классы абстрактными сделаем?

kruzer25

а смысл? что нам вообще это даст кроме того, что нельзя будет создавать объекты этих классов?
Это уменьшит путаницу.
Мне вот что-то не очень получается представить ситуацю, когда один конкретный класс потомок другого конкретного, ты уверен, что у тебя ситуация такая?
Оставить комментарий
Имя или ник:
Комментарий: