[php] вопрос по классам
уточняя... мне нужно, чтобы при вызове B::stfunc вызывалась внутри тела функции B::afunc
точное название класса, который наследует A - заранее не известно.придется узнать
![](/images/graemlins/wink.gif)
зы: я плохо в пхп, но это просто ахтунг. без знания дочернего класса вызывать его метод в интерпретируемом языке с инвалидной поддержкой ООП...
можно завести переменную в классе 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.
![](/images/icons/grin.gif)
а слона-то я и не приметил
там статика кругом
![](/images/graemlins/wink.gif)
А чем не катит self::afunc в теле a::stfunc?
class A
{
static func {}
}
class B extend A
{
}
в вызове B::func конструкция self:: в теле func будет обозначать именно класс A, а не класс B. Это как раз написано в цитате, которую я привел выше. А она с документации php.net
А вообще, почему используются именно статические методы? Если пользоваться тут не классами, а объектами - всё отлично работает...
Вообще, если интересует для чего, эти классы у меня используются для отображения окошек в движке для сайта. Окошко==класс. Поэтому, зачем мне объекты то создавать? Вполне хватает статики.
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;
?>
2) а я такой же вариант уже привел:)
![](/images/graemlins/smile.gif)
![](/images/icons/grin.gif)
<?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 и С) - три разных объекта, с которыми можно работать независимо.
![](/images/graemlins/blush.gif)
![](/images/icons/grin.gif)
а смысл? что нам вообще это даст кроме того, что нельзя будет создавать объекты этих классов?Это уменьшит путаницу.
Мне вот что-то не очень получается представить ситуацю, когда один конкретный класс потомок другого конкретного, ты уверен, что у тебя ситуация такая?
Оставить комментарий
oleg1331
мне что-то не приходит в голову, как вообще это можно сделать (пусть даже и криво)... Идеи будут?
Примечание, точное название класса, который наследует A - заранее не известно.