Web студия "GrandView"
  Главная   Написать Контакты
   
   
О проекте
Руководство php
 

XII. Функции работы с Классами/Объектами

Введение

Нижеописанные функции позволят вам получить информацию о классах и экземплярах объектов. Вы можете получить имя класса из экземпляра объекта равно как и все его свойства и методы. Используя эти функции, вы сможете установить не только принадлежность объекта к конкретному классу, но и определить наследование (к примеру какой класс наследует класс данного объекта).

Требования

Эти функции всегда доступны.

Установка

Для использования этих функций не требуется проведение установки, поскольку они являются частью ядра PHP.

Настройка во время выполнения

Данное расширение не определяет никакие директивы конфигурации в php.ini.

Типы ресурсов

Данное расширение не определяет никакие типы ресурсов.

Предопределенные константы

Данное расширение не определяет никакие константы.

Примеры

В приведённом ниже примере, мы сначала определим базовый класс и класс его наследующий. Базовый класс описывает овощ: съедобен ли и какого внешне цвета. Дочерний класс Spinach добавляет метод приготовления овоща и проверки -- был ли он уже приготовлен.

Пример 1. classes.inc

<?php

// базовый класс с основными свойствами и методами
class Vegetable {

    var
$edible;
    var
$color;

    function
Vegetable($edible, $color="green")
    {
       
$this->edible = $edible;
       
$this->color = $color;
    }

    function
is_edible()
    {
        return
$this->edible;
    }

    function
what_color()
    {
        return
$this->color;
    }
   
}
// конец класса Vegetable

// расширяет базовый класс
class Spinach extends Vegetable {

    var
$cooked = false;

    function
Spinach()
    {
       
$this->Vegetable(true, "green");
    }

    function
cook_it()
    {
       
$this->cooked = true;
    }

    function
is_cooked()
    {
        return
$this->cooked;
    }
   
}
// конец класса Spinach

?>

Теперь мы создадим по объекту каждого класса и распечатаем информацию о них, включая наследовательность. Также мы объявим несколько функций-утилит, главным образом для удобного вывода результатов.

Пример 2. test_script.php

<pre>
<?php

include "classes.inc";

// функции-утилиты

function print_vars($obj)
{
   
$arr = get_object_vars($obj);
    while (list(
$prop, $val) = each($arr))
        echo
"\t$prop = $val\n";
}

function
print_methods($obj)
{
   
$arr = get_class_methods(get_class($obj));
    foreach (
$arr as $method)
        echo
"\tfunction $method()\n";
}

function
class_parentage($obj, $class)
{
    if (
is_subclass_of($GLOBALS[$obj], $class)) {
        echo
"Object $obj belongs to class " . get_class($$obj);
        echo
" a subclass of $class\n";
    } else {
        echo
"Object $obj does not belong to a subclass of $class\n";
    }
}

// создание экземпляров объектов

$veggie = new Vegetable(true, "blue");
$leafy = new Spinach();

// распечатка информации об объектах
echo "veggie: CLASS " . get_class($veggie) . "\n";
echo
"leafy: CLASS " . get_class($leafy);
echo
", PARENT " . get_parent_class($leafy) . "\n";

// показать свойства объекта класса Spinach
echo "\nveggie: Properties\n";
print_vars($veggie);

// и методы объекта базового класса Vegetable
echo "\nleafy: Methods\n";
print_methods($leafy);

echo
"\nParentage:\n";
class_parentage("leafy", "Spinach");
class_parentage("leafy", "Vegetable");
?>
</pre>

Важно заметить, что в приведенном выше примере объект $leafy -- экземпляр класса Spinach, который наследует класс Vegetable, вследствие чего последний пункт скрипта выведет:

[...]
Parentage:
Object leafy does not belong to a subclass of Spinach
Object leafy belongs to class spinach a subclass of Vegetable

Содержание
call_user_method_array --  Вызываем метод объекта с массивом параметров [устаревшее]
call_user_method --  Вызывает метод указанного объекта [устаревшее]
class_exists -- Проверяет был ли объявлен класс
get_class_methods -- Возвращает массив имен методов класса
get_class_vars --  Возвращает массив свойств класса с их инициализационными значенями
get_class -- Возвращает имя класса к которому принадлежит объект
get_declared_classes -- Возвращает массив с именами объявленных классов
get_declared_interfaces --  Возвращает массив всех объявленных в текущей итерации интерфейсов.
get_object_vars -- Возвращает ассоциативный массив свойств и значений объекта
get_parent_class -- Возвращает имя класса базового для объекта или класса
interface_exists -- Checks if the interface has been defined
is_a --  Возвращает TRUE если объект принадлежит классу или является одним из его наследователей.
is_subclass_of --  Возвращает TRUE если объект является экземпляром класса, наследующего данный.
method_exists -- Проверяет существует ли метод в данном классе
property_exists --  Checks if the object or class has a property


call_user_method_array> <ccvs_void
Last updated: Sat, 27 Jan 2007
 
add a note add a note User Contributed Notes
Функции работы с Классами/Объектами
malg
25-Jul-2007 02:21
In the function class_parentage(), the use of  'get_class($$obj)' causes the omission of the word Spinach in the second/last call to this function.

I replaced 'get_class( $$obj )' with 'get_class( $GLOBALS[$obj] )' successfully.
rajvin120 at rediffmail dot com
09-Apr-2007 11:27
I had tried this code but when I create the word object it takes so much time and throws a exception.

com_load_typelib('Word.Application');
   
$word_object = new COM("word.application") or die("Cannot create Word object");

$word_object->Documents->Open($file_path, false, true);

$word_object->Selection->WholeStory();

$word_data = $word_object->Selection->Text;

$word_object->ActiveDocument->Close(True);

$word_object->Quit(True);
Bardo
18-Nov-2006 07:38
<?
//this wil give you a nice view over your used classes.
//in my config-file i've loaded my classes
//this script gives you a class-diagram
//still need to something about the javascript feature...
//hope it helps you :)

include("config.php");

function drawClass($c){
    if($c['beschrijving']){
        echo "<table style=\"background-color: #FFFFCC; border: 1px solid black;\">".$c['beschrijving'];
    }
    foreach($c as $k=>$sub){
        if($k!="beschrijving"){
            echo "<tr><td>";
            drawClass($c[$k],($i+1));
            echo "</td></tr>";
        }
    }
    if($c['beschrijving']){
        echo "</table><br>";
    }
}
?>
<html>
<head>
<style>
*{
    font-family: Verdana;
    font-size: 10pt;
}
</style>
<script>
var mem=new Array();
function up(id){
    if(!mem[id]) mem[id]=true;
    else mem[id]=false;
    if(mem[id])    document.getElementById(id).style.visibility="hidden";
    else document.getElementById(id).style.visibility="visible";
}
</script>
</head>
<body>

<?
$list=array();
$classes=get_declared_classes();
foreach($classes as $k=>$v){
    $vars_p=array();
    $meth_p=array();
    $parent=array($v);
    $parent_tmp=$v;
    $target= &$list;
    while($parent_tmp=get_parent_class($parent_tmp)){
        array_push($parent,$parent_tmp);
        $vars_p=array_merge($vars_p,get_class_vars($parent_tmp));
        $meth_p=array_merge($meth_p,get_class_methods($parent_tmp));
    }
    for($i=count($parent)-1;$i>=0;$i--){
        if(!is_array($target[$parent[$i]])){
            $target[$parent[$i]]=array();
        }
        $target= &$target[$parent[$i]];
    }

    $str="<tr><td style=\"background-color: #FFCC66;\"><button onclick=\"up('$v');\">UP</button>";
    foreach($parent as $itt=>$p) $str.=($itt>0?"::":"").$p;
    $str.="</td></tr><tr><td>";
    $str.="<table style=\"background-color: #FFFFCC; width: 300px;\" id=\"".$v."\">";
   
    $vars=get_class_vars($v);
    foreach($vars as $l=>$w){
        if(!is_numeric(array_search($l,array_keys($vars_p)))){
            $str.="<tr><td>var ".$l.($w?"=".$w:"").";</td></tr>";
        }
    }
    $meth=get_class_methods($v);
    foreach($meth as $l=>$w){
        if(!is_numeric(array_search($w,$meth_p))){
            $str.="<tr><td>function ".$w."(){}</td></tr>";
        }
    }

    $str.="</table></td></tr>";

    $target['beschrijving']=$str;
}

drawClass($list);
?>

</body>
</html>
kim dot hermansson at gmail dot com
01-Sep-2006 08:40
Note to the solution by 'zabmilenko at hotmail dot com':

Good idea but encapsulation is a better technique which is also more portable and reliable.

You can pass an object which is based on an interface/superclass to the common DB interface.

For instance:
<?php

class DB_Common {
 
// data can be either an uri or array depending on how you construct it
  // e.g. data = array('host' => 'x.x.x.x', 'port' => '65535', 'etc' => '...')
 
function connect($data) { die("must be overriden by subclass"); }
  function
disconnect() { die("..."); }
  function
query($query) { die("..."); }
}

class
DB_MySQL extends DB_Common { /* override methods here */ }
class
DB_PgSQL extends DB_Common { /* same here */

class DB_Frontend {
  var
$errmsg = array('DB_Common subclass-string or object required');
  var
$_db;
 
// PHP4/5 compat
 
function DB_Frontend($arg) { $this->__construct($arg); }
  function
__construct($arg) {
    if(
is_object($arg) && is_a($arg, 'DB_Common') )
     
$this->_db = $arg;
    else
    {
      if( !
is_string($arg) )
        die(
$this->errmsg[0]);
     
$arg = "DB_$arg";
      if( !
class_exists($arg) )
        die(
$this->errmsg[0]);
     
$this->_db = new $arg;
     
// use is_subclass_of(object, string) for compat with older versions
     
if( !is_subclass_of($arg, 'DB_Common') )
        die(
$this->errmsg[0]);
    }
  }
 
// add connect, disconnect that simply calls $this->_db->method() instead
 
function getOne($quey) {
   
// preprocess query if needed
   
$result = $this->_db->query($query);
   
// process result if needed
   
return $result;
  }
 
/* add more methods if needed */
}

// string parameter
$frontend = new DB_Frontend('MySQL');

// object parameter
$backend = new DB_MySQL();
$frontend = new DB_Frontend($backend);

?>

You can also use a static DB class. If you see PEAR::DB you will see how all this is quite equal to eachother. The main difference is the frontend class which should encapsulte the backend.

Suggestions and/or comments appreciated.
beconfused at googlemail dot com
20-Jul-2006 06:18
function from Tobias K.....
stdClass Object to XML

xml:
[CODE]
"$xml<?xml version='1.0' standalone='yes'?>" .
"<movies>" .
    "<movie eur=\"10.00\">" .
        "<title>PHP: Behind the Parser</title>" .
        "<characters>" .
            "<character>" .
                "<name>Ms. Coder</name>" .
                "<actor>Onlivia Actora</actor>" .
            "</character>" .
            "<character>" .
                "<name>Mr. Coder</name>" .
                "<actor>El Act
Новости
11 июля 2007
Сайт запущен
© 2007 info@grandviewstudio.com
http://www.poker-jackpot.ru ; Нужен трубовоз - трубовоз - продажа в Москве. Z058440144362 Z348613067571