Web-мастер: курс молодого бойца

Пример класса

   

 Добавлено 2008-04-19 14:34:01



Сообщений: 132
Зарегистрирован: 02.01.2008

Цитировать
Решил немного попрактиковать в создании класса - реализовал большинство зарезервированных методов + удобную систему слежки за всеми событиями объекта (константа DEBUG), хотелось бы услышать замечания.
file class.php:
<pre>
<?php
include("style.css");
define("DEBUG",TRUE);
main();

class 
myVar
{
    private static 
$_globAmount 0;
    private static 
$_globRealAmount 0;
    private static 
$_debugMsg "";
    private 
$_varVal;
    private 
$_varId;

    private function 
getAttr()
    {
        
$attrStr "";
        
$first TRUE;
        foreach (
$this as $attrName => $attrValue)
        {
            if (
$first)
            {
                
$first FALSE;
            }
            else
            {
                
$attrStr .= ", ";

            }
            
$attrStr .= $attrName." = ".$attrValue;
        }
        return 
$attrStr;
    }

    public function 
__construct($value NULL)
    {
        static 
$counter 0;
        
$counter++;
        
self::$_globAmount++;
        
self::$_globRealAmount++;
        
$this->_varId self::$_globAmount;
        
$this->_varVal $value;
        
self::$_debugMsg .= "<div>Call to method \"".__METHOD__."\" (".$counter." total calls) of the class \"".__CLASS__."\". An object with attributes (".$this->getAttr().") has been constructed.\n";
        
self::$_debugMsg .= "Total number of objects (existing = ".self::$_globRealAmount.", constructed = ".self::$_globAmount.", destructed = ".(self::$_globAmount-self::$_globRealAmount).").</div>\n";
        return;
    }

    public function 
__destruct()
    {
        static 
$counter 0;
        
$counter++;
        
self::$_globRealAmount--;
        
self::$_debugMsg .= "<div>Call to method \"".__METHOD__."\" (".$counter." total calls) of the class \"".__CLASS__."\". An object with attributes (".$this->getAttr().") has been distructed.\n";
        
self::$_debugMsg .= "Total number of objects (existing = ".self::$_globRealAmount.", constructed = ".self::$_globAmount.", destructed = ".(self::$_globAmount-self::$_globRealAmount).").</div>\n";
        
$this->_varId NULL;
        
$this->_varVal NULL;
        if (
DEBUG)
        {
            echo 
self::$_debugMsg;
        }
        
self::$_debugMsg "";
        return;
    }

    public function 
__clone()
    {
        static 
$counter 0;
        
$counter++;
        
self::$_globAmount++;
        
self::$_globRealAmount++;
        
self::$_debugMsg .= "<div>Call to method \"".__METHOD__."\" (".$counter." total calls) of the class \"".__CLASS__."\".\nAn object with attributes (".$this->getAttr().") has been copied ";
        
$this->_varId self::$_globAmount;
        
self::$_debugMsg .= "into an object with attributes (".$this->getAttr().").\n";
        
self::$_debugMsg .= "Total number of objects (existing = ".self::$_globRealAmount.", constructed = ".self::$_globAmount.", destructed = ".(self::$_globAmount-self::$_globRealAmount).").</div>\n";
        return;
    }

    protected function 
__toString()
    {
        static 
$counter 0;
        
$counter++;
        
self::$_debugMsg .= "<div>Call to method \"".__METHOD__."\" (".$counter." total calls) of the class \"".__CLASS__."\".\n";
        
self::$_debugMsg .= "An object with attributes (".$this->getAttr().") has been printed.</div>\n";
        
$varStr "An object. (Type \"".__CLASS__."\", id \"".$this->_varId."\", value \"".$this->_varVal."\") \n";
        return 
$varStr;
    }

    final protected function 
__set($varName,$varVal)
    {
        static 
$counter 0;
        
$counter++;
        
self::$_debugMsg .= "<div>Call to method \"".__METHOD__."\" (".$counter." total calls) of the class \"".__CLASS__."\".\n";
        
self::$_debugMsg .= "<b>Warning:</b> Attribute \"".$varName."\" is private (protected) or doesn't exist! Value \"".$varVal."\" is lost!</div>\n";
        return 
false;
    }

    final protected function 
__get($varName)
    {
        static 
$counter 0;
        
$counter++;
        
self::$_debugMsg .= "<div>Call to method \"".__METHOD__."\" (".$counter." total calls) of the class \"".__CLASS__."\".\n";
        
self::$_debugMsg .= "<b>Warning:</b> Attribute \"".$varName."\" is private (protected) or doesn't exist!</div>\n";
        return 
false;
    }

    final protected function 
__call($funcName,$funcArgs)
    {
        static 
$counter 0;
        
$counter++;
        
self::$_debugMsg .= "<div>Call to method \"".__METHOD__."\" (".$counter." total calls) of the class \"".__CLASS__."\".\n";
        
self::$_debugMsg .= "<b>Warning:</b> Method \"".$funcName."\" is private (protected) or doesn't exist!</div>\n";
        return 
false;
    }

    final public static function 
getRealAmount()
    {
        static 
$counter 0;
        
$counter++;
        
self::$_debugMsg .= "<div>Call to method \"".__METHOD__."\" (".$counter." total calls) of the class \"".__CLASS__."\".\n";
        
self::$_debugMsg .= "A value (".self::$_globRealAmount.") has been returned.</div>\n";
        return 
self::$_globRealAmount;
    }

    final public static function 
getAmount()
    {
        static 
$counter 0;
        
$counter++;
        
self::$_debugMsg .= "<div>Call to method \"".__METHOD__."\" (".$counter." total calls) of the class \"".__CLASS__."\".\n";
        
self::$_debugMsg .= "A value (".self::$_globAmount.") has been returned.</div>\n";
        return 
self::$_globAmount;
    }

    public function 
getId()
    {
        static 
$counter 0;
        
$counter++;
        
self::$_debugMsg .= "<div>Call to method \"".__METHOD__."\" (".$counter." total calls) of the class \"".__CLASS__."\".\n";
        
self::$_debugMsg .= "A value (".$this->_varId.") has been returned.</div>\n";
        return 
$this->_varId;
    }

    public function 
getValue()
    {
        static 
$counter 0;
        
$counter++;
        
self::$_debugMsg .= "<div>Call to method \"".__METHOD__."\" (".$counter." total calls) of the class \"".__CLASS__."\".\n";
        
self::$_debugMsg .= "A value (".$this->_varVal.") has been returned.</div>\n";
        return 
$this->_varVal;
    }

    public function 
setValue($value)
    {
        static 
$counter 0;
        
$counter++;
        
self::$_debugMsg .= "<div>Call to method \"".__METHOD__."\" (".$counter." total calls) of the class \"".__CLASS__."\".\nAn object with attributes (".$this->getAttr().") has been modified ";
        
$this->_varVal $value;
        
self::$_debugMsg .= "into an object with attributes (".$this->getAttr().").\n";
        
self::$_debugMsg .= "</div>\n";
        return 
$this->_varVal;
    }
}

function 
main()
{
    
$a = new myVar(12);
    
myVar::getRealAmount();
    
myVar::getAmount();
    
$b = clone $a;
    
$b->getId();
    
$b->test();
    
$b->dsgs;
    
$b->dsgs 124;
    
$b->setValue(123);
    
myVar::getRealAmount();
    
myVar::getAmount();
    echo 
$a;
    echo 
$b;
    
$a NULL;
    
$b NULL;
    
myVar::getRealAmount();
    
myVar::getAmount();
}

?>
</pre>
file style.css:
<style type="text/css">
div
{
    border: 1px solid black;
    margin: 0px 5px 0px 5px;
    padding: 2px 2px 2px 4px;
}
pre
{
    font-size: 12px;
}
</style>



Shit can happen...
Наверх  Посмотреть профиль    

 Добавлено 2008-04-19 22:30:23



Сообщений: 132
Зарегистрирован: 02.01.2008

Цитировать
Пример класса, который может иметь только один объект.


Shit can happen...
Наверх  Посмотреть профиль    

 Добавлено 2008-04-20 18:31:34



Сообщений: 132
Зарегистрирован: 02.01.2008

Цитировать
Правила наследования классов:
1. Публичный атрибут или метод остается публичным в унаследовавшем классе.
2. Защищенный атрибут или метод остается защищенным в унаследовавшем классе.
3. Приватный атрибут или метод не может быть унаследованным.
4. Статичный атрибут или метод остается статичным в унаследовавшем классе.
5. Финальный класс не может быть унаследованным.
6. Фмнальный метод не может быть переопределен.
7. Атрибут не может быть финальным.
8. Неабстрактный метод обязан иметь тело.
9. Если в классе присутствует абстрактный метод, тогда и сам класс обязан быть абстрактным.
10. Абстрактный класс не может порождать объекты собственного типа.
11. Только к статичным атрибутам и методам абстрактного класса можно обращаться только благодаря оператору поля видимости.
12. Абстрактный метод не может иметь тела.
13. Обращение к абстрактному методу невозможно.
14. Абстрактный класс не может быть финальным.
15. Атрибуты не могут быть абстрактными.
16. Абстрактный метод унаследованный неабстрактным классом обязан быть переопределен.
17. Абстрактный метод не может быть финальным.
18. Абстрактный метод не может быть приватным.


Shit can happen...
Наверх  Посмотреть профиль   Отредактировано автором 20.04.2008
   
Быстрый ответ
 
Цвет шрифта: Закрыть все теги
Сообщение
Защитный код