Jump to content
  • 0

Изучаю PHP


Great Rash
 Share

Question

Добрый вечер!

Я отчаялся установить Apache и PHP по отдельности (ну никак не хотели работать). Скачал себе пакет AppServ (установил его без проблем) и засел за изучения PHP.

Сразу оговорюсь, что базовые знания этого языка у меня имеются. Я как то раз даже интернет-магазин написал самостоятельно. Но умел я программировать только процедурным методом, да и знал язык плохо. И вот теперь хочу засесть за изучение языка основательно.

Купил себе книгу под названием "PHP Практика создания WEB-сайтов", авторы Максим Кузнецов и Игорь Семдянов, издание второе. Книга толстая - 1244 страницы, так что должно быть освящено все достаточно подробно. Выбор на эту книгу пал из-за того, что первая же глава сразу начинается с изучения ООП, ну и вообще оглавление крайне понравилось - никакой воды, лишь необходимая инфа.

Кого книга вдруг заинтересовала тут можно позырить на нее.

Но случилась неприятность - застрял практически сразу же. Изучаю параграф про инкапсуляцию и для начала там приводится вот такой листинг:

<?php
class Employee {
public $surname;
public $name;
public $patronymic
private $age;
}
?>

Потом рассматривается обращение к членам класса Employee:

<?php
require_once("classes/class.employee.php");

$emp = new Employee();

$emp->surname = "Пупкин";
$emp->name = "Василий";
$emp->patronymic = "Петрович";

echo $emp->surname." ".$emp->name." ".$emp->patronymic;
?>

И тут (опачки) вместо ожидаемого Пупкина Василия Петровича у меня на выходе вот такая ошибка:

Parse error: syntax error, unexpected T_PRIVATE, expecting ',' or ';' in D:\AppServ\www\lessons\classes\class.employee.php on line 6

Что это все это значит? При чем тут запятая или точка с запятой? Проблема в книге, в моих кривых руках или в настройках PHP?

phpinfo.php показывает, что у меня PHP Version 5.2.6.

Link to comment
Share on other sites

Recommended Posts

  • 0

Сам как бы сейчас тоже начинаю изучать PHP - так что выбираю подходящую книгу.

Конкретна мне кажется все таки не для новичка…

Сначала нужно синтаксис освоить в полной мере… Чтобы прочувствовать язык.

Link to comment
Share on other sites

  • 0

Внатуре! Нереально туплю, все поперепроверял, а слона то не увидел... Просто не ожидал, что могу такую глупую ошибку сделать. Видимо меня смутило то что ругался на приватную переменную и говорил про 6 строку, а ошибка то на пятой...

Конкретна мне кажется все таки не для новичка…

Я ж говорю, что я не совсем новичек в PHP. Кой-чего знаю. Так что для меня эта книженция в самый раз.

Link to comment
Share on other sites

  • 0

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

Link to comment
Share on other sites

  • 0

У меня назрел вопрос относительно стиля в коде:

в книге рекомендуется писать приватные переменные и методы в конце класса, насколько это правильно?

Просто имхо не очень читабельно когда записано так:

class SomeClass {
public $var1;
public $var2;

public function get_var3() {
return $this->var3;
}

private var3;
}

Или это наоборот правильно?

Link to comment
Share on other sites

  • 0
У меня назрел вопрос относительно стиля в коде:

в книге рекомендуется писать приватные переменные и методы в конце класса, насколько это правильно?

Стилистика написания не играет никакой роли, какую для себя выберешь, такую и используй. Все равно нужно будет переучиваться, если пойдешь на работу в какую-то большую компанию. Там тебе не дадут отсебятину пороть. :(

Link to comment
Share on other sites

  • 0
У меня назрел вопрос относительно стиля в коде:

в книге рекомендуется писать приватные переменные и методы в конце класса, насколько это правильно?

Конечно, свойства класса приятнее группировать по способу инкапсуляции, но все же лучше объявления всех свойств делать раньше, чем методов.

Мне так и в голову бы не пришло смотреть объявления свойств в конце класса. Это как-то по-индусски.

Link to comment
Share on other sites

  • 0
Мне так и в голову бы не пришло смотреть объявления свойств в конце класса. Это как-то по-индусски.

По мне - красивее.

Прятать приватные или же защищенные переменные.

Или же когда у тебя около 30 переменных объявляется.

Вообще дело вкуса.

	/**
* Информация о пользователе.
* @var string | integer
* @access public
*/

public $uid = 0;
public $username = '';
public $mgroup = 0;
public $email = '';
public $joined = 0;
public $ip_adress = 0;
public $language = '';
public $last_visit = 0;
public $last_activity = 0;
public $member_login_key = '';

Edited by AMD
Link to comment
Share on other sites

  • 0
По мне - красивее.

Прятать приватные или же защищенные переменные.

Или же когда у тебя около 30 переменных объявляется.

Вообще дело вкуса.

Думаю, если в классе объявляется по 30 свойств, это уже какие-то проблемы с архитектурой класса... Возможно, стоит разбить его на несколько узкоспециализированных... или инкапсулировать свойства в массивы... использовать методы __set() и __get()

Link to comment
Share on other sites

  • 0

	/**
* Ищем по обработчикам и вызываемых классах.
*
* @access public
* @param string Key
* @return object Stored object
*/

public function __get( $key )
{
self::checkForInit();

if ( array_key_exists($key, self::$handles) ) return self::$handles[$key];

$_class = self::getClass( $key );

if ( is_object( $_class ) )
{
return $_class;
}

}

Я например регистрировал класс amd_lol.

Могу вызвать через getClass('amd_lol');

или так:

registry::getInstance()->amd_lol->loadHelper('hello_world');

или так:

$class = registry::getInstance();

$class->amd_lol->closeConnection();

Тогде то и сработает метод __get

или с помощью интерфейса ArrayAccess

$class['amd_lol']->ololo;

@keltanas, знаю страшное извращение, но мне это нравится :angry:

Edited by AMD
Link to comment
Share on other sites

  • 0
<?php
class Test
{
function __get($new_var) {
echo "вызов неопределенного свойства: $new_var<BR>";
}

function __set($new_var, $value) {
$this->$new_var = $value;
echo "новое свойство: $new_var = $value<BR>";
}
}

$test = new Test;
echo $test->unknown; # работает метод __get()
echo $test->unknown = 12345; # работает метод __set()
?>

Edited by CenapaTop
Link to comment
Share on other sites

  • 0
echo $test->unknown; # работает метод __get()

echo $test->unknown = 12345; # работает метод __set()

это плохой пример использования __get и __set, если я уберу эти методы из класса. все будет и так отлично работать

Link to comment
Share on other sites

  • 0

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

<?php
class test {
private $arr = array();

private function __get($index) {
return $this->arr[$index];
}

private function __set($index, $value) {
$this->arr[$index] = $value;
}
}

echo $test->arr;
?>

То есть просто так ты не сможешь вне класса задать значения в массив, а с помощью этих методов, это возможно.

Edited by vvsh
Link to comment
Share on other sites

  • 0

Именно этот пример есть у меня в книжке. Только из него не ясно для чего нужны эти методы. Только ли для работы с приватными массивами? Почему нельзя сделать переменную $arr публичной и работать с ней без дополнительных методов?

Link to comment
Share on other sites

  • 0

Честно говоря, я понятия не имею для чего она нужна и, вероятно, никогда и не узнаю. Мне кажется, что изучение программирования вы начинаете "не с того конца". Я думаю, что надо сначала выбрать цель, а потом подбирать под это дело методы. Это и в жизни так - я вот понятия не имею как надевать нитку на швейную машинку (видел как это жена делает - там целый процесс) и совершенно не парюсь по этому поводу. Надо будет - научусь. И тут так же - не обязательно использовать 100% языка и, соответственно, знать тоже не обязательно. Надо будет что-то сделать - глянете справочник (или гугланёте) и подберёте подходящий метод. Лучше знать (в смысле наизусть) три языка на 30%, чем один на 100%. Это, конечно, моё личное мнение и его не обязательно слушать, но всё же...

Link to comment
Share on other sites

  • 0

Цель у меня есть: в книге есть целая глава, посвященная созданию класса пейджинатора, который должен выводить список файлов (или данных БД, или данных из текстового файла), разбитый на страницы. Так вот этот класс реализуется, в том числе, при помощи метода __toString(), про который в книге написано совсем поверхностно а именно:

Позволяет интерполировать (подставлять) объект в строку

Из этого объяснения мне ничего не понятно. Я и полез гуглить на эту тему. Но в сети тоже толкового объяснения нет - только примеры из которых, опять же, ничего не ясно.

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