Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
 Аватар для Laroux
172 / 167 / 75
Регистрация: 21.11.2014
Сообщений: 1,490

Ошибка "Parse error: syntax error, unexpected '{', expecting '(' in"

21.06.2016, 17:42. Показов 4660. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
имеется класс safemysql.class.php
Хочу заточить его под нужды своего сайта с помощью наследования
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//подключаю исходный класс
//в нем уже зашиты параметры доступа к БД - хост, юзер и пасс
include('sql/safemysql.class.php');
//задаю таблицу, в которой у меня клиенты
$clients_table='cltbl';
//расширяю класс из файла safemysql.class.php
class Client extends SafeMySQL {
    //определяем таблицу
    private $table;
    //определяем идентификатор клиента
    public $id_client;
    //задаем значения
    public function __construct($table, $id_client) {
        $this->table = $clients_table;
        $this->id_client = $id_client;
    }
    //функция получения данных одного клиента из таблицы клиентов
    function GetClientContacts {
        //getInd() - это метод класса SafeMySQL
        return SafeMySQL::getInd("id","SELECT * FROM '".$this->table."' WHERE `id`=".$this->id_client.";");
    }
}
создаю файл index.php с кодом
PHP
1
2
include ('class_client.php');
new Client(3);
получаю ошибку "Parse error: syntax error, unexpected '{', expecting '(' in /home/host1331299/key-trade.ru/htdocs/www/zk/class_client.php on line 19"
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.06.2016, 17:42
Ответы с готовыми решениями:

Parse error: syntax error, unexpected T_VARIABLE, expecting T_FUNCTION
<?php class Test{ public $serik="Сека молодец"; function test1(){ echo $this->serik; }

Второй день бьюсь над ошибкой "Parse error: syntax error, unexpected '(', expecting ',' or ';' "
Ошибка: Parse error: syntax error, unexpected '(', expecting ',' or ';' in D:\........\mail.php on line 5 В этом файле: <?php ...

Parse error: syntax error, unexpected 'text' (T_STRING)
Parse error: syntax error, unexpected 'text' (T_STRING) in C:\Program Files\EasyPHP-12.1\www\proka4ka-rp.su\ips_kernel\classDb.php on line...

19
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
21.06.2016, 17:47
Цитата Сообщение от Laroux Посмотреть сообщение
public function __construct($table, $id_client) { $this->table = $clients_table; $this->id_client = $id_client; } //функция получения данных одного клиента из таблицы клиентов function GetClientContacts {
А точку-запятую после } перед GetClientContacts ставить не нужно разве?
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
21.06.2016, 17:50
Лучший ответ Сообщение было отмечено pav1uxa как решение

Решение

Code
1
2
-function GetClientContacts {
+function GetClientContacts() {
1
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
21.06.2016, 18:25
Цитата Сообщение от Laroux Посмотреть сообщение
имеется класс safemysql.class.php
Хочу заточить его под нужды своего сайта с помощью наследования
Зачем? Что умеет этот чудо класс, чего не умеет PDO?
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
21.06.2016, 18:59
Цитата Сообщение от Hikari Посмотреть сообщение
А точку-запятую после } перед GetClientContacts ставить не нужно разве?
Нет конечно.
0
 Аватар для Laroux
172 / 167 / 75
Регистрация: 21.11.2014
Сообщений: 1,490
21.06.2016, 22:14  [ТС]
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Зачем? Что умеет этот чудо класс, чего не умеет PDO?
ну мне, допустим, в PDO придется вникать какое-то время. А этим "чудом" я умею пользоваться, причем довольно давно. И мне нравится

Дело привычки, наверное.. Можете попробовать меня отговорить, на самом деле - может быть он не полезен, а вреден

Добавлено через 16 минут
Действительно со скобками затупил, простите меня.

У меня, как совсем новичка, есть еще вопрос: обратите внимание на 5-ю строку моего кода. Там указано значение переменной, которая содержит наименование таблицы, с которой будет работать класс.
далее в строке 14 я пытаюсь задать это значение извне. Естественно, класс его не видит...

Переменная неизменная.. она берется из настроек БД (или из файла настроек - какого-нить config.inc.php)

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

Подскажите, пожалуйста, правильные методы использования внешних переменных в классе

Добавлено через 58 минут
Вычитал пока только единственный вариант:
PHP
1
2
3
include ('class_client.php');
$client = new Client(3);
$client->clients_table=$clients_table;
и он работает. Так надо? или есть более "элегантные" и\или правильные способы?

Добавлено через 6 минут
Цитата Сообщение от Laroux Посмотреть сообщение
У меня, как совсем новичка
поправлюсь немного: "новичка в ООП"
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
21.06.2016, 22:29
Цитата Сообщение от Laroux Посмотреть сообщение
Подскажите, пожалуйста, правильные методы использования внешних переменных в классе
Правильный метод это не использовать внешних переменных. Почему бы не передавать ее в конструкторе.
И так же большие сомнения у меня что тут нужно использовать отношение наследования. Родительский класс позволяет выполнить произвольный запрос к бд, получается что класс Client тоже, что явно выходит за зону его ответственности.
0
 Аватар для Laroux
172 / 167 / 75
Регистрация: 21.11.2014
Сообщений: 1,490
21.06.2016, 22:35  [ТС]
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Почему бы не передавать ее в конструкторе
я не совсем понимаю как. Повторюсь: вот есть у меня файл настроек. И в нем прописаны наименования всех используемых в системе таблиц в виде переменных, которые в дальнейшем используются везде в коде.
Я и хотел бы так оставить, чтобы единожды изменив в файле настроек имя таблицы система продолжала работать с новой таблицей.

Цитата Сообщение от Jewbacabra Посмотреть сообщение
большие сомнения у меня что тут нужно использовать отношение наследования. Родительский класс позволяет выполнить произвольный запрос к бд, получается что класс Client тоже, что явно выходит за зону его ответственности
согласен с Вами. Правильнее, наверное, будет использовать методы класса SafeMySQL в новом классе Client. Так?
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
21.06.2016, 22:56
Laroux, как я понимаю Client::$table общий у всех объектов, его можно сделать статичным. В конструкторе проверяем его наличие, если нет то достаем
PHP
1
2
3
4
5
6
7
8
class Client {
    private static $table;
    public function __construct() {
        if ( !isset(self::$table) ) {
            self::$table = getTableNameFromConfig();
        }
    }
}
Сделать синглтон для работы с бд
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
class DB {
    private static $instance;
    private $db;
    private function __construct($params) {
        $this->db = SafeMySQL($params);
    }
    public static function getInstance() {
        if ( !isset(self::$db) ) {
            self::$db = new self();
        }
        return self::$db;
    }
}
И в методах класса Client (да и любых других) теперь можно делать так:
PHP
1
DB::getInstance()->query(...);
В таком виде оставлять конечно не очень хорошо, но для начала изучения наверно хватит.
1
 Аватар для Laroux
172 / 167 / 75
Регистрация: 21.11.2014
Сообщений: 1,490
22.06.2016, 20:16  [ТС]
Черт.. что ж так сложно-то...
я вот сижу смотрю и никак не могу понять, откуда берется $table?

Добавлено через 8 часов 27 минут
блин, ребят.. задолбался я с процедурным стилем. И функции не спасают.
Вот сижу, пишу очередной функционал - четко понимаю, что я уже это где-то делал. Но наворочено столько, что найти сложно.
Прямая дорога в ООП. И вроде как получается что-то. Но не хочу лепить костыли еще и на ООП.. Может подскажете все же нормальный какой-то мануал поподробнее, где рассматривалось бы создание и использование класса с внешними константами?
Заранее благодарен
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
22.06.2016, 21:18
Цитата Сообщение от Laroux Посмотреть сообщение
класса с внешними константами
Что такое класс с внешними константами? Для чего? Лучше объясните подробнее какую цель Вы преследуете.
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,904
22.06.2016, 21:22
Цитата Сообщение от Laroux Посмотреть сообщение
откуда берется $table?
так вот же:
Цитата Сообщение от Jewbacabra Посмотреть сообщение
PHP
1
2
3
if ( !isset(self::$table) ) {
* * * * * * self::$table = getTableNameFromConfig();
* * * * }
Если у свойства пустое значение, тогда оно берётся из getTableNameFromConfig().
0
 Аватар для Laroux
172 / 167 / 75
Регистрация: 21.11.2014
Сообщений: 1,490
22.06.2016, 21:52  [ТС]
pav1uxa, я уже писал выше, но задача, исходя из комментариев гуру, немного изменилась:

есть класс safemysql для работы с БД (мы сейчас не будем рассматривать вопрос о том, почему я его юзаю, хотя если мне объяснят, что он ни к чему, я "поковыряю" что-нить встроенное в PHP).
Далее я создаю класс Client, в котором будут методы, использующие методы из класса safemysql.
В качестве отправной точки для класса Client используется, допустим, две переменные: 1) id клиента; 2) наименование таблицы с клиентами.
Параметры доступа к БД у меня жестко прописаны в классе safemysql (т.е. мне не надо беспокоиться о том, что поменяется сервер, пароль к БД или что-то другое - я просто изменю это в одном месте и всех делов).
А вот дальше в классе Client у меня будут заюзаны вышеуказанные переменные.

Переменная с id клиента, понятно, будет передаваться при создании объекта, ну к примеру
PHP
1
$client = new Client($_GET['id']);
А вот наименование таблицы клиентов в БД у меня задано в неком файле настроек. И я хочу, чтобы класс Client работал именно с этой переменной, которая задана в файле настроек.

Вот я смотрю выше на пример Jewbacabra, но нифига не могу понять, как в класс Client попадает переменная, которая содержит наименование таблицы.

Извините за тупость

Добавлено через 17 минут
P.S. Нашел у знакомого почитать "РНР объекты, шаблоны и методики программирования" 4-е издание от Мэтта Зандстра. По стилю и наполнению нравится. И понятно написано.

Но описание опирается на PHP 5.5. Вроде как между 5.5 и 5.6 в части ООП есть достаточно сильные различия. Стоит ли продолжить чтение, или поискать что-то посвежее?
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
22.06.2016, 21:59
Цитата Сообщение от Laroux Посмотреть сообщение
Переменная с id клиента, понятно, будет передаваться при создании объекта
Цитата Сообщение от Laroux Посмотреть сообщение
А вот наименование таблицы клиентов в БД у меня задано в неком файле настроек. И я хочу, чтобы класс Client работал именно с этой переменной, которая задана в файле настроек.
Ну так и передавайте ее при создании объекта, так же как id клиента:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
class Client
{
    public $table;
    public $id;
    public function __construct($id, $table)
    {
        $this->id = $id;
        $this->table = $table;
    }
}
 
$id = 3; // global ID
$table = "hello"; // global table
 
$client = new Client($id, $table);
 
echo $client->table;
0
 Аватар для Laroux
172 / 167 / 75
Регистрация: 21.11.2014
Сообщений: 1,490
22.06.2016, 22:07  [ТС]
pav1uxa, работать будет, да.. и еще способ есть, который я описал тут, но в моем случае меня смущает то, что я классу, который по любому должен юзать именно эту таблицу, должен еще про это не забыть "напомнить", а в Вашем примере смущает то, что я классу передаю как действительно динамическую переменную id, так и статичное значение table.

Хотелось сделать как-нить "по-взрослому"
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
22.06.2016, 22:12
Цитата Сообщение от Laroux Посмотреть сообщение
который по любому должен юзать именно эту таблицу, должен еще про это не забыть "напомнить",
PHP
1
2
3
4
class Client
{
    private static $table = "table";
}
0
 Аватар для Laroux
172 / 167 / 75
Регистрация: 21.11.2014
Сообщений: 1,490
22.06.2016, 22:13  [ТС]
pav1uxa, дык у меня мало ли где еще будет юзаться эта табличка. Поэтому ее название вынесено в отдельный файл, где указано, что-то типа
PHP
1
$clients_table="table";
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
22.06.2016, 22:29
Цитата Сообщение от Laroux Посмотреть сообщение
дык у меня мало ли где еще будет юзаться эта табличка. Поэтому ее название вынесено в отдельный файл, где указано, что-то типа
Вариант 1:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
// Объявление класса
class Client
{
    public static $table = "defaultTable";
}
 
// "Отдельный файл"
$table = "anotherTable";
Client::$table = $table;
 
// "Мало ли где еще"
echo $table;
Вариант 2:
PHP
1
2
3
4
5
6
7
8
9
10
11
// Объявление класса
class Client
{
    public static $table = "defaultTable";
}
 
// "Отдельный файл"
Client::$table = "anotherTable";
 
// "Мало ли где еще"
echo Client::$table;
Вариант 3:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
// Объявление класса
class Client
{
    private static $table = "defaultTable";
    public static function setTable($table)
    {
        self::$table = $table;
    }
}
 
// "Отдельный файл"
$table = "anotherTable";
Client::setTable($table);
 
// "Мало ли где еще"
echo $table;
В методах класса использовать как self::$table.

Если Вы хотите просто глобальную переменную использовать в методах класса - то так не получится. Можно изощриться, конечно, но зачем? Это не ООП. Для чего переходить на ООП тогда не понятно.
1
 Аватар для Laroux
172 / 167 / 75
Регистрация: 21.11.2014
Сообщений: 1,490
22.06.2016, 22:34  [ТС]
Ладно, ребят.. спасибо всем огромное за помощь, но, думаю, надо найти какого-нить нормального программера, взять пузырь и чтоб вдолбил мне идеологию. У меня, кажется, именно тут пробел
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
22.06.2016, 22:37
Цитата Сообщение от Laroux Посмотреть сообщение
P.S. Нашел у знакомого почитать "РНР объекты, шаблоны и методики программирования" 4-е издание от Мэтта Зандстра. По стилю и наполнению нравится. И понятно написано.
Но описание опирается на PHP 5.5. Вроде как между 5.5 и 5.6 в части ООП есть достаточно сильные различия. Стоит ли продолжить чтение, или поискать что-то посвежее?
Вполне сойдет. Принципиальных различий 5.5 от 5.6 и 7.0 нет. Еще желательно банду четырех осилить
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.06.2016, 22:37
Помогаю со студенческими работами здесь

Parse error: syntax error, unexpected T_VARIABLE in
Подскажите почему бьет эту ошибку на 9-й строке?

Пишет ошибку: Parse error: syntax error
4 часа уже пытаюсь что то сделать и не айда. &lt;?php class RegUser { private static $conn; //для подключения к серверу ...

Syntax error, unexpected '=' in
ругаеться на вот эту строку $test = model-&gt;get_old(); вот ошибка Parse error: syntax error, unexpected '=' in что я не правельно...

Syntax error, unexpected '$peremennaya1
Почему возникает данная ошибка? Parse error: syntax error, unexpected '$peremennaya1' (T_VARIABLE), expecting function (T_FUNCTION) in...

Ошибка Parse error: syntax error, unexpected T_STRING, expecting T_CONSTANT_ENCAPSED_STRIN
При запуске локального сервера, выдает эту ошибку. Parse error: syntax error, unexpected T_STRING, expecting T_CONSTANT_ENCAPSED_STRING...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru