Класс - тип объектов, которым присущи одинаковые свойства.
Экземпляр класса - объект.
Функции (называются методами класса) хранятся для всего класса, Переменные (называются членами класса) - для объектов.
Таким образом, очевидно, функции компилируются один раз при подключении класса, и могут вызываться где-то в зависимости от их уровня доступа (public/protected/private) и контекста (static или нет).
Примечание: при работе с объектами с версии 5, они всегда передаются по ссылке. Копирование делается ключевым словом clone.
контексты вызова:
класс (статический :: )
объект (динамический ->)
Статический подразумевает полную отвязку от конкретного объекта. То есть при таком вызове возможно использование только статических методов и членов.
MyClass::staticMethod();
Вызов делается в контексте всего класса, как видно. Ни о каком объекте речи здесь, внутри такого метода, не может идти.
Здесь создается экземпляр объекта, и соответственно под него выделяется память:
$obj = new MyClass();
$obj->name = 'Василий';
$obj->method();
MyClass::staticMethod();
Здесь мы назначаем свойству объекта значение. Метод (method) вызываемый после в контексте объекта может получить значение этого свойства, потому что вызван в контексте этого же объекта.
Однако, следующий вызов (MyClass::staticMethod) не может получить это значение, поскольку вызван в контексе всего класса. Такой вызов бывает иногда очень полезен, если не требуется доступ к свойствам какого-то определенного объекта.
Примечание: паттерн синглтон использует статический метод для обращения к сущности синглтона. то есть фактически статический метод может использоваться для обращения к какому-то объекту. для подробностей гуглить пример реализации паттерна.
Примечание:
в php < 5 версии объекты копировались целиком, а не по ссылке. Поэтому в различных фреймворках/ЦМС, написанных для php4, можно увидеть примерно такие строки:
$obj =& new MyClass();
return &$obj;
Этот код предотвращает php от создания копии объекта при каждом чихе.
Обращение к свойствам и методам внутри методов класса. Рассмотрим метод method, указанный выше.
public function method()
{
echo $this->name; // обращение к свойству, которое было установлено до вызова
$this->anotherMethod(); // вызов другого метода в контексте этого объекта
self::staticMethod(); // вызов метода в контексте всего класса
}
Теперь рассмотрим метод staticMethod
public static function staticMethod()
{
// здесь вызов с использованием $this вызовет ошибку
echo 'Hello world'; //
echo self::$classProperty; // статическое свойство класса так же может быть запрошено из статического метода или из глобального контекста, если имеет соответствующий модификатор доступа.
$this->method(); // будет ошибка
}
Рассмотрим теперь примерный листинг класса, который описан выше
class MyClass
{
public $name;
public static $classProperty = 'Class property';
public function method()
{
echo $this->name; // обращение к свойству, которое было установлено до вызова
$this->anotherMethod(); // вызов другого метода в контексте этого объекта
self::staticMethod(); // вызов метода в статическом контексте
}
public function anotherMethod() { }
public static function staticMethod()
{
// здесь вызов с использованием $this вызов ошибку
echo 'Hello world'; //
echo self::$classProperty; // статическое свойство класса так же может быть запрошено из статического метода
$this->method(); // будет ошибка
}
}
Начиная с этого момента и далее:
Фразы "Внутри объекта" и "Вызов в контексте объекта" означает, что произошел вызов метода у объекта (то есть внутри динамически вызванного метода: $obj->method())
Фразы "Внутри класса" и "Вызов в контексте класса" означает, несмотря на свою двусмысленность, именно статический вызов метода (MyClass::staticMethod())
В завершение, обозначим что такое self и $this в описанном листинге:
$this - это ссылка на объект, в контексте которого вызван метод. Если вызов в контексте всего класса, то эта ссылка не определена.
self - это локальное пространство имен, определенное внутри класса. По сути внутри любого метода класса MyClass строки
self::staticMethod();
MyClass::staticMethod();
идентичны.
С публикацией этой части я проспал малость. Задания еще не готовы. Постараюсь выложить их здесь же в ближайшее время.
Спустя 1 день, 5 часов, 22 минуты, 52 секунды (12.12.2009 - 13:48) glock18 написал(а):
Итак задания. Так как урок теоретический и относится к пхп в целом, задания тоже относятся к пхп в целом.
1.
средствами php поменять местами значения переменных, не используя третью переменную. имеется ввиду только явное объявление переменной. способов решения очень много. предоставить нужно хотя бы 2 варианта решения.
2.
каков результат и почему?
3. оценить эффективность методов половинного деления и перебора при поиске. оценка должна опираться на n - количество элементов в массиве.
обычный перебор - проходим по массиву от начала и до конца, выбирая все совпадения.
метод половинного деления - действует если массив отсортирован. итеративно:
1. берем средний элемент.
2. сравниваем с тем, что ищем (больше, меньше, равно)
3.1 если больше, то повторяем то же самое для той половины массива, которая содержит элементы больше того, который сравнили с эталоном.
3.2 если меньше - для половины, где элементы меньше.
3.3 все просто. поднимаемся по массиву выше, а затем ниже, до тех пор пока элементы попадают под критерий сравнения.
кому-то будет этого достаточно. здесь есть математическое описание: http://elib.ispu.ru/library/math/sem1/kiselev1/node79.html
необходимо реализовать простейшую реализацию поиска и индексации. скажу по секрету, что оценка должна показать большое преимущество половинного деления
так вот для него необходимо иметь отсортированный массив.
так вот, имеем базу данных работников (лежит где-нибудь в обычном файле)
атрибуты:
id,
имя,
должность.
в обычном файле id - инкрементится разумеется как в обычной бд. то есть последний элемент должен быть с наибольшим id и сам файл как бы получается проиндексированным по id.
нужно организовать поиск по файлу по имени или должности. соответственно для каждого из атрибутов, нужно иметь по индексу. каждый индекс должен формировать скрипт. поиск разумеется тоже. при поиске должно считаться количество итераций по массиву. возможно, получится использовать register_tick_function для своих целей здесь.
задача:
1. написать простой поиск с использованием индексных файлов.
2. написать генерацию индексных файлов.
Задача не такая уж и сложная, как может показаться. Как обычно - я могу направить ход мыслей в нужном направлении в скайпе или здесь.
Этот поиск нужен вовсе не для использования его в реальных проектах, хотя вполне сгодился бы, если задача стоит в том, чтобы отказаться от баз данных. Смысл задания просто в том, чтобы понять как поиск делается в принципе.
Третье задание выполнять можно по желанию. 1 и 2 обязательные.
1.
$a = 'любая строка или число';
$b = 'любая другая строка или число';
средствами php поменять местами значения переменных, не используя третью переменную. имеется ввиду только явное объявление переменной. способов решения очень много. предоставить нужно хотя бы 2 варианта решения.
2.
$arr = array(1, 2, 3, 4);
foreach ($arr as &$item) {
print $item;
}
foreach ($arr as $item) {
print $item;
}
каков результат и почему?
3. оценить эффективность методов половинного деления и перебора при поиске. оценка должна опираться на n - количество элементов в массиве.
обычный перебор - проходим по массиву от начала и до конца, выбирая все совпадения.
метод половинного деления - действует если массив отсортирован. итеративно:
1. берем средний элемент.
2. сравниваем с тем, что ищем (больше, меньше, равно)
3.1 если больше, то повторяем то же самое для той половины массива, которая содержит элементы больше того, который сравнили с эталоном.
3.2 если меньше - для половины, где элементы меньше.
3.3 все просто. поднимаемся по массиву выше, а затем ниже, до тех пор пока элементы попадают под критерий сравнения.
кому-то будет этого достаточно. здесь есть математическое описание: http://elib.ispu.ru/library/math/sem1/kiselev1/node79.html
необходимо реализовать простейшую реализацию поиска и индексации. скажу по секрету, что оценка должна показать большое преимущество половинного деления

так вот, имеем базу данных работников (лежит где-нибудь в обычном файле)
атрибуты:
id,
имя,
должность.
в обычном файле id - инкрементится разумеется как в обычной бд. то есть последний элемент должен быть с наибольшим id и сам файл как бы получается проиндексированным по id.
нужно организовать поиск по файлу по имени или должности. соответственно для каждого из атрибутов, нужно иметь по индексу. каждый индекс должен формировать скрипт. поиск разумеется тоже. при поиске должно считаться количество итераций по массиву. возможно, получится использовать register_tick_function для своих целей здесь.
задача:
1. написать простой поиск с использованием индексных файлов.
2. написать генерацию индексных файлов.
Задача не такая уж и сложная, как может показаться. Как обычно - я могу направить ход мыслей в нужном направлении в скайпе или здесь.
Этот поиск нужен вовсе не для использования его в реальных проектах, хотя вполне сгодился бы, если задача стоит в том, чтобы отказаться от баз данных. Смысл задания просто в том, чтобы понять как поиск делается в принципе.
Третье задание выполнять можно по желанию. 1 и 2 обязательные.
Спустя 18 дней, 9 часов, 11 минут, 4 секунды (30.12.2009 - 22:59) VolCh написал(а):
Упс, как-то я пропустил появление задания, теперь уж, наверное, только в следущем году