Archive for the ‘OOP’ Category

Объект по умолчанию

Tuesday, December 23rd, 2008

Если надо быстро создать оъект где важны не методы а как способ хранения переменных то можно воспользоваться стандартным обьектом по умолчанию

$foo = new stdClass();
$foo->bar = 'string';
$foo->num = 10;

Вызов приватного метода из статического

Wednesday, December 10th, 2008
class Option_propose{
    private function option_sub_serch(){
                return $value;
    }
    public static function propose(){
        $value = self::option_sub_serch();
    }
}
Option_propose::propose();

как видно функция вызывается не через $this а через self

Такое имя переменной

Wednesday, April 30th, 2008

Если вам захочется использовать не традиционное, для PHP, имя для переменной в классе, то воспользуйтесь конструкцией {’name’}.

$s = new myClass();
$s->{'var with strange name'} = 15;
echo $s->{'var with strange name'}; //15

Вывод переменных класса

Wednesday, April 30th, 2008

Еще один простой и быстрый способ увидеть переменные класса это print_f

print_f(myClass)

stdClass Object
(
[$a] => "1 may"
)

Имя дочернего класса 0.5

Friday, April 25th, 2008

Ну в таком контксте можно было получить в версии ниже 5.3

class A {
function test() {
echo get_class($this);
}
}

class B extends A {
function __construct() {
parent::test();
}
}
new B();

в результате дает B на php 5.2.5

В 5.3 появилось позднее СТАТИЧЕСКОЕ связвыние.
По поводу него мануал:
language.oop5.late-static-bindings.php
и заметка на
хабре

автор: solenko

Имя дочернего класса

Thursday, April 24th, 2008

В новом PHP 5.3 дбавленно много вкусного, get_called_class() позволяет получить имя дочернего класса в родительском

class base {
	function say($text){
		echo $text." from ".get_called_class();
	}
}

class ext extends base {
	function __construct(){
		parent::say("hello");
	}
}

$ex = new ext();

hello from ext

Подкачка классов

Wednesday, April 23rd, 2008

Для расширения взможностей функции __autoload с версии 5,1 появилась новая функция, позволяющая загружать класы из разных каталогов

spl_autoload_register(null,false);

function libsLoader($classLib) {
    require("/libs/".$classLib.".php");
}
function baseLoader($classKernel) {
       	require($classLib.".php");
}

spl_autoload_register('libsLoader',false);
spl_autoload_register('baseLoader',false);

теперь если потребутеся загрузить класс то функция проверит его в базовом каталоге, а затем в каталоге библиотек

Класс для сборки Mysql

Friday, March 21st, 2008

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

class DBManager {
	private $selectables = array();
	private $table;
	private $whereClause;
	private $limit;
public function select(){
	$this->selectables=func_get_args();
	return $this;
}
public function from($table) {
	$this->table = $table;
	return $this;
}
public function where($clause) {
	$this->whereClause = $clause;
	return $this;
}
public function limit($limit) {
	$this->limit = $limit;
	return $this;
}
public function result() {
	$query = "SELECT ".join(",",$this->selectables)."
		FROM {$this->table}";
	if (!empty($this->whereClause))
	$query .= " WHERE {$this->whereClause}";
	if (!empty($this->limit))
	$query .= " LIMIT {$this->limit}";
	return $query;
  }
} 

$db= new DBManager();
$db->select("id","name")->from("users")->where("id=1")
->limit(1)->result();

Namespace в php 5.3

Monday, March 17th, 2008

В php 5.3 сделан еще один шаг на пути к объектно ориентированному программированию это namespace или попросту пространство имён
Для чего это надо. вот простенький пример

class Test{
    function __constuct(){}
}

$test = new Test();

простой класс, и все работает хорошо пока таких классов не больше 10 и все их написали вы сами. Но если команда разработчиков состоит из большего числа народу, то рано или поздно но встанет ситуация когда названия двух классов в разных файлах совпадут. И из этого будет 2 решения, либо постоянно переименовывать классы либо воспользоваться namespace

namespace AuthModule;

class Test{
    function __constuct(){}
}
namespace DBModule;

class Test{
    function __constuct(){}
}
...
$login = new AuthModule::Test();
$login->a=10;
$connect = new DBModule::Test();
$connect->start();

Таким образом не только методы и переменные классов изолированы но и сами классы.

Клонирование объекта

Wednesday, March 12th, 2008

Займемся клонированием. Это не так круто как клонировать Доли, но тоже удобно.

class Person{

    public $name;
    public $age;
}

$per = new Person;
$per->name = "Maria";
$per->age = "20";

$per2 = clone $per;

echo $per2->name.', '.$per2->age;
//Maria, 20

Как видим не так уж сложно, после этого у нас два экземпляра класса, которые продолжают жить своей жизнью.
Помимо этого в класс можно добавить еще и функцию которая будет выполнятся при клонировании

function __clone(){
    $this->name = strtolower($this->name);
}
...
echo $per2->name.', '.$per2->age;
//maria, 20