Jump to content
  • 0

Помогите с ООП


Great Rash
 Share

Question

Дамы и Господа, не мог бы кто-нить из вас написать мини-тутор по ООП в PHP?

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

Или пните на грамотный ресурс по данному вопросу, а то что-то я ничего путного не нагуглил.

Всем заранее гран мерси!

Link to comment
Share on other sites

24 answers to this question

Recommended Posts

  • 0

Этот пост не раскрывает все понятия ООП в ПХП и в общем, он только для ознакомления =)

Немного про ооп =)

ООП базируется на понятии класса.

// объявление класса
class clsName
{
// тело класса
// объявление переменных класа (переменные класса это свойства класса)

$name = "some value"; // объявление свойства
var $name2 = ="some name v2"; // объявление свойства в стиле php4(не советую использовать, но знать нужно)

// объявление функции класса (функции класса ето методы класса)

function fName()
{
// команды
}
}

После того как описали свойства и методы класса нужно создать обьект ето класса

Имея 1 клас мы можем создать столько экземпляров сколько хотим(но нужно ли^_^ ). Для каждого обьекта можно задать уникальные значения свойств, а так же вызывать методы с различными параметрами.

$obj = new clsName();

Доступ к свойству:

$obj->name; // возвращает значение $name

Доступ к методу:

$obj->fName(); // возвращает значение метода fName();

внутри класса могут использоваться такие константы:

__METHOD__ - имя метода в котором используется константа

__CLASS__ - имя класса

Так же внутри класса испотльзуется ключевое слово this, которое ссылается на данный класс.

Существует 4 варианта объявления области видимости свойств\методов:

public - переменная\метод доступны из вне класса

private - переменная\метод доступны только внутри данного! класса

protected - переменная\метод доступны внутри даного класса и классах наследниках.

(Именно этими свойствами и реализируется инкапсуляция в ПХП)

-static - ключевое слово которое определяет метод\свойство которое будет одинаковым(неизменным) для всех экземпляров данного класса

class Test 			// определение класса
{
static $sTest = "Static value!<br />";
public $pTest = "Public value!<br />";
private $prTest = "Private value!<br />";
}
$obj = new Test; // создание объекта

echo $obj->sTest; // ничего не выведет
echo $obj->pTest; // выведет "Public value!"
echo $obj->prTest; // выдаст ошибку
echo $obj->myTest(); // выведет корректно, хоть такой вызов и работает, но он рассматривается как некорректный

echo Test::$sTest; // вывод статического свойства
echo Test::myTest(); // вывод статического метода

Коструктор и деструктор.

__construct() - функция которая визивается при создании объекта

__destruct() - функция которая вызивается при удалении объекта

длявызова конструктора родительского класса из класса наследника используеться конструкция

parent::__construct()

Наследование в ПХП реализируеться механизмом расширения классов.

class A
{
// описание родительского класса
}

class B extends A
{
// описание расширяемого класса(потомок)
}

В расширяемом класс можно переопределять методы\свойства базового класса.

Переопределение методов\свойств происходит следующим образом: в классе наследнике определяется метод\свойство с таким же именем как и в базовом классе.

Ето называется перегрузкой методов\свойств.

НО!

Существует ключевое слово final которое запрещает переопределение.

Если применить final перед определением класса, то драный класс будет являться конечным и больше сможет быть использованным в роли базового класа для расширения других классов.

final class A 
{
// описание класса
}

В ПХП так же реализирован полиморфизм. Он достигается с помощью создания абстрактных классов.

Суть абстрактных классов ето определение абстрактных методов.

Абстрактный метод - ето виртуальный метод который не может вызываться непосредственно, без переопределения.

Класс который содержит хоть 1 абстрактный метод - абстрактный класс.

abstract - ключевое слово которое объявляет класс как абстрактный.

abstract class AbstractClass
{
// абстрактные методы
abstract protected function getValue();
abstract protected function prefixValue($prefix);

// обычный метод
public function printOut() {
print $this->getValue() . "\n";
}
}

class StandartClass extends AbstractClass
{
protected function getValue() {
return "ConcreteClass1";
}

public function prefixValue($prefix) {
return "{$prefix} StandartClass";
}
}

Интерфейс - это абстрактный класс содержащий лишь абстрактные методы и не определяя тела методов.

// Определения интерфейса
interface iTest
{
public function hello();
public function goodbay();
}

Подключение интерфейса определяется ключевым словом implements

class Test implements iTest
{
public function hello()
{
echo "hello =)";
}

public function goodbay()
{
echo "goodbay =(";
}
}

Есть еще "Магические методы" http://ua2.php.net/manual/en/language.oop5.magic.php

Если будут желающие я их опишу =)

Ну вот так вот в двух словах =)))

ЗЫ: Не судите строго :D . Жду конструктивную критику ;)

Edited by Mot
Link to comment
Share on other sites

  • 0

Мне все понравилось, хочется поподробней узнать про:

-public - переменная\метод доступны из вне класса
-private - переменная\метод доступны только внутри данного! класса
-protected - переменная\метод доступны внутри даного класса и классах наследниках.
(Именно етими свойствами и реализируется инкапсуляция в ПХП)

-static - ключевое слово которое определяет метод\свойство которое будет одинаковым(неизменным) для всех экземпляров данного класса

В каких случаях что применяется и почему нельзя обойтись только публичными методами.

Link to comment
Share on other sites

  • 0

Gотому что некоторые методы нежелательно чтобы вызывались кем попало, в этом случае используй protected. Получатся функции для служебного пользования. А если нужно чтобы и потомки не могли ими пользоваться, то private.

static лично я часто использую чтобы делать так:

$f=admin::GetUserList();

Вместо

$admin=new admin;

$f=$admin->GetUserList();

Edited by Int
Link to comment
Share on other sites

  • 0

Инкапсуля́ция — свойство объединить и защитить данные и код в объект и скрыть реализацию объекта от пользователя. При этом пользователю предоставляется только спецификация (интерфейс) объекта.

В итоге с помощью public, private, protected реализируется инкапсуляция в ПХП. Это значит что пользователь может работать только с теми методами, которые для этого предназначены. Пользователь не может из внешней программы влиять объект, только через интерфейс. Реализутеся с помощью использования закрытых данных и методов.

Вполне можно обходиться и публичными методами, но ето иногда вводит в заблуждение тех кто потом использует написанный вами код.

Для решения тривиальных задач публичные методы подходят. ^_^ (Пример: класс для стандартной реализации работи с MySQL)

Если расширить задачу то:

Можно написать методы для реализации INSERTa SELECTa UPDATE итд. и отдельный метод myQuery который обьявить private. Дальше в теле INSERTa SELECTa UPDATE итд. формируется SQL-запрос и вызываеться внутрикласовый метод myQuery который производит сам запрос.

Таким образом можем ограничить список SQL запросов для пользователя. ;)

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

С помощью этого метода можно создавать подобие библиотек функций. Если все методы в классе объявить как статические то грубо говоря у нас будет только 1 объект - сам класс

Доступ к свойствам класса:

SomeClass::$someVariable;

Доступ к методам класса:

SomeClass::SomeMethod();

Protected более лоялен. Если вы хотите взять определенный класс за базовый, то те методы которые в нем объявлены как Private не будут доступны.

Private - переменная\метод доступны только внутри данного! класса.

Protected - ведет себя как и private, но свойство \метод объявленный как protected может быть доступен из класса потомка.

Edited by Mot
Link to comment
Share on other sites

  • 0
для етого
но ето
С помощью етого
http://lurkmore.ru/КЛБ

http://www.logoped.org/

Ну как было мимо пройти?

Кстати, в мануалах PHP обо всём спрошенном хорошо рассказано. Но по-английски, правда.

Edited by Int
Link to comment
Share on other sites

  • 0

Поправляю:

Не нравится как я пишу - будьте добры, поправьте. ^_^
А "Это" всё-таки пишется через э.

Кстати, кто как использует try catch? Я что-то не могу найти применения.

Edited by Int
Link to comment
Share on other sites

  • 0

Ну да, деление на ноль, пожалуй, не отловит.

Ктсати, там не только false, там ещё и 0 и '' и ещё несколько значений. Но ведь $a можно проверять и if (!is_resource($a)), if (is_object($a)). В большинстве случаев подавления ошибок достаточно чтобы не выодить их пользователю, но обработать отсутствие нужного результата.

Link to comment
Share on other sites

  • 0

false, 0, '', NULL - все ети значения при проверке выдают false.

В ПХП механизм исключений не полностью реализирован.

Обработка исключений - вот все прекрасно расписано, особенно блок "Достоинства и недостатки".

Я иногда их использую в качестве "Использование исключений в целях контроля ошибок повышает читаемость кода, так как позволяет отделить обработку ошибок от самого алгоритма".

Link to comment
Share on other sites

  • 0

Для отладки, в некоторых случаях, имеет смысл использоваться такой конструкцией:

function exception_handler($exception) {
echo "Exception: ".$exception->getMessage()."\n";
}

set_exception_handler('exception_handler');

throw new Exception('Some exception');
echo "Not Executed\n";

Edited by Mot
Link to comment
Share on other sites

  • 0
try
{
$rs=sqlite_query($this->db,$string);
if ($rs === false)
throw new Exception('Ошибка выполнения SQL-запроса'.($this->debug?': '.sqlite_error_string(sqlite_last_error($this->db)):''));
}
catch (Exception $ex)
{
$this->err=$ex->getMessage();
return 0;
}

У меня в этом случае всё равно сам sqlite ошибками сыпет, пока не сделаю @sqlite_query. Так что какой-то странный try

Link to comment
Share on other sites

  • 0
У меня в этом случае всё равно сам sqlite ошибками сыпет, пока не сделаю @sqlite_query. Так что какой-то странный try

Ну так исключения это не перехват ошибок :lol:

я б переписал ваш код примерно следующим образом

try
{
if (@sqlite_query($this->db,$string))
throw new Exception('Ошибка выполнения SQL-запроса'.($this->debug?': '.sqlite_error_string(sqlite_last_error($this->db)):''));
}
catch (Exception $ex)
{
$this->err=$ex->getMessage();
// или вот так
$this->err = "При подключении к базе данных возникла ошибка.<br />\nФайл:{$ex->getFile()}<br />\nСтрока:{$ex->getLine()}<br />\nНомер:{$ex->getCode()}<br />\nСообщение:{$ex->getMessage()}<br />\n";
}

catch это обработчик но не функция, значение он не возвращает.

Edited by Mot
Link to comment
Share on other sites

  • 0

Так я и не жду от него значения, он ставит переменную, а я потом через $sql->err() эту переменную проверяю :lol:

Кстати, если переписать на if, то функция, часть которой я показал, не сможет делать select. Ну да не суть, гдавное, что у меня работает.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy