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

зы: я плохо в пхп, но это просто ахтунг. без знания дочернего класса вызывать его метод в интерпретируемом языке с инвалидной поддержкой ООП...
можно завести переменную в классе A, в которую дочерний класс будет записывать свое имя.
class A {
data childName ;
};
class B extends A
{
constructor {
childName = B;
}
}
пришлось жертвовать статикой и насильно добавлять системный метод во второй класс:
это все из-за того, что:
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.
какие конструкторы в статическом классе? Ты чего? В пхп ооп конечно хромает, но не на столько сильно, чтобы в статике еще конструкторы вызывались 
ах да;)
а слона-то я и не приметил
там статика кругом
)
а слона-то я и не приметил
там статика кругом
)А чем не катит self::afunc в теле a::stfunc?
потому что он будет вызывать именно ту afunc которая определена в классе А. Это происходит из-за того, что при статическом вызове self обозначает именно тот клас, в котором находится вызываемый код, а не тот, который указывается при вызове функции. т.е. при:
в вызове B::func конструкция self:: в теле func будет обозначать именно класс A, а не класс B. Это как раз написано в цитате, которую я привел выше. А она с документации php.net
class A
{
static func {}
}
class B extend A
{
}
в вызове B::func конструкция self:: в теле func будет обозначать именно класс A, а не класс B. Это как раз написано в цитате, которую я привел выше. А она с документации php.net
Ага, не заметил вторую часть твоей цитаты (прочитал только про то, что нет $this).
А вообще, почему используются именно статические методы? Если пользоваться тут не классами, а объектами - всё отлично работает...
А вообще, почему используются именно статические методы? Если пользоваться тут не классами, а объектами - всё отлично работает...
понятно, что с объектами все работает. но у меня не объекты, а именно статические классы.
Вообще, если интересует для чего, эти классы у меня используются для отображения окошек в движке для сайта. Окошко==класс. Поэтому, зачем мне объекты то создавать? Вполне хватает статики.
Вообще, если интересует для чего, эти классы у меня используются для отображения окошек в движке для сайта. Окошко==класс. Поэтому, зачем мне объекты то создавать? Вполне хватает статики.
1) А если тебе потом придётся какие-то данные хранить или несколько одинаковых окошек? Попробуй, кстати, посмотреть на singleton.
2) Извращённо, но работает:
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;
?>
1) что есть сабж? (можно ссылку сразу на документацию и способы применения?
2) а я такой же вариант уже привел:)
2) а я такой же вариант уже привел:)
черт, а мне понравилась эта штука
И как я без нее раньше жил? 
И как я без нее раньше жил? <?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 и С) - три разных объекта, с которыми можно работать независимо.
Сначала скажи, почему классы A и B нельзя сделать абстрактными 

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


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