Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Ошибка в простом классе с 1ой функцией [2]

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): « 1 [2]   

> Описание: Как правильно обьявить класс и обратиться к функции?
Конструктор
Отправлено: 23 Августа, 2011 - 19:18:41
Post Id



Частый гость


Покинул форум
Сообщений всего: 128
Дата рег-ции: Апр. 2010  


Помог: 1 раз(а)




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

(Отредактировано автором: 23 Августа, 2011 - 19:20:55)



-----
Если все время идти вперед, до цели будет немного ближе..
 
 Top
DeepVarvar Супермодератор
Отправлено: 23 Августа, 2011 - 19:20:06
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Конструктор пишет:
все переменные для всех функций надо будет присваивать в конструкторе?
Нет, можно сделать несколько методов:

...connect();
...selectDB();
...close();
...setCharset();
...queryCount();

и т.д.....
 
 Top
DeertOff
Отправлено: 23 Августа, 2011 - 19:20:47
Post Id



Гость


Покинул форум
Сообщений всего: 126
Дата рег-ции: Июль 2011  


Помог: 3 раз(а)




Необязательно в классе определять все переменные!
Вам главное разобраться с тем что в определении функции(метода) не должно содержаться переменных
В вашем примере используете переменную - $this -> $database_name
в определении функции function delete_db($this -> $database_name){}
 
 Top
Конструктор
Отправлено: 23 Августа, 2011 - 19:32:59
Post Id



Частый гость


Покинул форум
Сообщений всего: 128
Дата рег-ции: Апр. 2010  


Помог: 1 раз(а)




А почему eclipse ругается если прописывать private ?
PHP:
скопировать код в буфер обмена
  1. class db1
  2. {
  3.         private $servername = 'localhost';
  4.         private $username = 'root';
  5.         private $password = 'root';    
  6.         private $database_name;

пишет : syntax error, unexpected 'private'

(Отредактировано автором: 23 Августа, 2011 - 19:34:40)



-----
Если все время идти вперед, до цели будет немного ближе..
 
 Top
DeertOff
Отправлено: 23 Августа, 2011 - 19:33:11
Post Id



Гость


Покинул форум
Сообщений всего: 126
Дата рег-ции: Июль 2011  


Помог: 3 раз(а)




не должен ругаться если у вас стоит закрывающая скобка
PHP:
скопировать код в буфер обмена
  1.  
  2.     class db1
  3.     {
  4.             private $servername = 'localhost';
  5.             private $username = 'root';
  6.             private $password = 'root';    
  7.             private $database_name;
  8.     }
  9.  

почитайте http://php.su/learnphp/phpoo/

(Отредактировано автором: 23 Августа, 2011 - 19:35:44)

 
 Top
Конструктор
Отправлено: 23 Августа, 2011 - 19:38:35
Post Id



Частый гость


Покинул форум
Сообщений всего: 128
Дата рег-ции: Апр. 2010  


Помог: 1 раз(а)




DeertOff пишет:
скобка есть но ругается сам эклипс
и Php тоже
CODE (htmlphp):
скопировать код в буфер обмена
  1. Parse error: syntax error, unexpected T_PRIVATE in C:\xampp\htdocs\test.loc\www\basa1.php on line 5

(Отредактировано автором: 23 Августа, 2011 - 19:39:52)



-----
Если все время идти вперед, до цели будет немного ближе..
 
 Top
DeertOff
Отправлено: 23 Августа, 2011 - 20:06:52
Post Id



Гость


Покинул форум
Сообщений всего: 126
Дата рег-ции: Июль 2011  


Помог: 3 раз(а)




возможно вы пытаетесь получить доступ к защищённому свойству "$username"; в не класса
возможно пропустили ";"

(Отредактировано автором: 23 Августа, 2011 - 20:11:34)

 
 Top
Конструктор
Отправлено: 23 Августа, 2011 - 21:46:24
Post Id



Частый гость


Покинул форум
Сообщений всего: 128
Дата рег-ции: Апр. 2010  


Помог: 1 раз(а)




короче вот что у меня получилось, и при этом оно работает:

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. class db1
  3. {      
  4.         private $servername = 'localhost';
  5.         private $username = 'root';
  6.         private $password = 'root';
  7.  
  8.         /* *************************************
  9.          * Функция удаления базы данных.
  10.          * В функцию передается имя базы данных.
  11.          */
  12.         function delete_db($database_name)
  13.         {
  14.                 $con = mysql_connect( $this->servername , $this->username , $this->password );
  15.                         if (!$con)
  16.                         {
  17.                                 die( 'Could not connect: '.mysql_error() );
  18.                         }              
  19.                 /* Delete database */  
  20.                 if (mysql_select_db($database_name, $con))
  21.                 {
  22.                         mysql_query( "DROP DATABASE ".$database_name , $con ); 
  23.                 }
  24.                         else
  25.                         {
  26.                                 return 0;              
  27.                         }
  28.         mysql_close($con);     
  29.         }
  30. }
  31.  
  32. $x = new db1();
  33. $x -> delete_db('data1');
  34. ?>

__
главная ошибка была нелепой я писал лишний $ >>> $this->$username

(Отредактировано автором: 23 Августа, 2011 - 21:47:45)



-----
Если все время идти вперед, до цели будет немного ближе..
 
 Top
Конструктор
Отправлено: 24 Августа, 2011 - 12:30:25
Post Id



Частый гость


Покинул форум
Сообщений всего: 128
Дата рег-ции: Апр. 2010  


Помог: 1 раз(а)




DeertOff пишет:
почитайте http://php.su/learnphp/phpoo/

кое что здесь уже устарело.. (например конструктор там по старому обьявляется именем класса, вместо __construct , и т.д.)
поэтому читаю здесь -> http://ru2.php.net/manual/en/lan...e.oop5.decon.php
_______
еще не до конца разобрался с конструктором,
почему получились ошибки в конструкторе? когда все без конструктора - ошибок нет:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. class db1
  3. {      
  4.        
  5.         function __construct($param)
  6.         {
  7. /*ошибка*/      private $servername = 'localhost';
  8. /*ошибка*/      private $username = 'root';
  9. /*ошибка*/      private $password = 'root';
  10.                 $this->database_name = $param;
  11.         }
  12.         /* *************************************
  13.          * Функция удаления базы данных.
  14.          * В функцию передается имя базы данных.
  15.          */
  16.         function delete_db()
  17.         {
  18.                 $con = mysql_connect( $this->servername , $this->username , $this->password );
  19.                         if (!$con)
  20.                         {
  21.                                 die( 'Could not connect: '.mysql_error() );
  22.                         }              
  23.                 /* Delete database */  
  24.                 if (mysql_select_db($this->database_name, $con))
  25.                 {
  26.                         mysql_query( "DROP DATABASE ".$this->database_name , $con );   
  27.                 }
  28.                         else
  29.                         {
  30.                                 return 0;              
  31.                         }
  32.         mysql_close($con);     
  33.         }
  34. }
  35.  
  36. $x = new db1('test4');
  37. $x -> delete_db();
  38. ?>

CODE (htmlphp):
скопировать код в буфер обмена
  1. Parse error: syntax error, unexpected T_PRIVATE in C:\xampp\htdocs\test.loc\www\basa2.php on line 7

Так ошибки нет:
PHP:
скопировать код в буфер обмена
  1. function __construct($param)
  2.         {
  3.                 $this->servername = 'localhost';
  4.                 $this->username = 'root';
  5.                 $this->password = 'root';
  6.                 $this->database_name = $param;
  7.         }
Но в этом случае все переменные будут Private или нет?

(Отредактировано автором: 24 Августа, 2011 - 12:51:16)



-----
Если все время идти вперед, до цели будет немного ближе..
 
 Top
DeepVarvar Супермодератор
Отправлено: 24 Августа, 2011 - 12:52:58
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Сначала переменные надо объявить (описать) до конструктора и поставить им: приват, паблик, статик, протектед...

А уж потом в конструкторе присваивать им значения.
 
 Top
Конструктор
Отправлено: 24 Августа, 2011 - 12:55:58
Post Id



Частый гость


Покинул форум
Сообщений всего: 128
Дата рег-ции: Апр. 2010  


Помог: 1 раз(а)




DeepVarvar пишет:
Сначала переменные надо объявить

получается в предыдущем варианте у меня все по умолчанию pablic стало?


-----
Если все время идти вперед, до цели будет немного ближе..
 
 Top
КЫР
Отправлено: 24 Августа, 2011 - 12:58:28
Post Id



Частый гость


Покинул форум
Сообщений всего: 168
Дата рег-ции: Авг. 2011  
Откуда: Новосибирск


Помог: 2 раз(а)




DeepVarvar
в предыдущем варианте у вас переменные уничтожаются после отработки функции
переменные объявляеются не
, а

(Отредактировано автором: 24 Августа, 2011 - 12:59:26)



-----
Fuck you guys, I'll going home
 
 Top
Конструктор
Отправлено: 24 Августа, 2011 - 13:02:02
Post Id



Частый гость


Покинул форум
Сообщений всего: 128
Дата рег-ции: Апр. 2010  


Помог: 1 раз(а)




Подправил, все работает, но можно ли как то избавиться от $param ?
Например чтобы переменная $this->database_name сама присваивала себе значение
при $x = new db1('значение $this->database_name');
PHP:
скопировать код в буфер обмена
  1. class db1
  2. {
  3.         private $servername;
  4.         private $username;
  5.         private $password;
  6.         private $database_name;
  7.         function __construct($param)
  8.         {
  9.                 $this->servername = 'localhost';
  10.                 $this->username = 'root';
  11.                 $this->password = 'root';
  12.                 $this->database_name = $param;
  13.         }

(Добавление)
ладно с лишним параметром это не самое важное
В итоге я получил 2 класса:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. class db1
  3. {
  4.         private $servername;
  5.         private $username;
  6.         private $password;
  7.         private $database_name;
  8.         function __construct($database_name)
  9.         {
  10.                 $this->servername = 'localhost';
  11.                 $this->username = 'root';
  12.                 $this->password = 'root';
  13.                 $this->database_name = $database_name;
  14.         }
  15.         /* *************************************
  16.          * Функция удаления базы данных.
  17.          * В функцию передается имя базы данных.
  18.          */
  19.         function delete_db()
  20.         {
  21.                 $con = mysql_connect( $this->servername , $this->username , $this->password );
  22.                         if (!$con)
  23.                         {
  24.                                 die( 'Could not connect: '.mysql_error() );
  25.                         }              
  26.                 /* Delete database */  
  27.                 if (mysql_select_db($this->database_name, $con))
  28.                 {
  29.                         mysql_query( "DROP DATABASE ".$this->database_name , $con );   
  30.                 }
  31.                         else
  32.                         {
  33.                                 return 0;              
  34.                         }
  35.         mysql_close($con);     
  36.         }
  37. }
  38. ?>

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. require_once 'basa1.php';
  3. class db2 extends db1
  4. {
  5.         function __construct()
  6.         {
  7.                 parent::__construct($database_name);
  8.                 echo 'Это наследуемый класс <br />';
  9.         }
  10. }
  11. $y = new db2('data11');
  12. $y -> delete_db();
  13. ?>

_________
так вот в наследуемом классе не работает функция первого класса.
Может наследуемом классе что-то не так с конструктором?
(Добавление)
Так заработало, но правлильно это или нет не знаю..
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. require_once 'basa1.php';
  3. class db2 extends db1
  4. {   private $database_name;
  5.         function __construct($database_name)
  6.         {
  7.                 parent::__construct($database_name);
  8.                 echo 'Это наследуемый класс <br />';
  9.         }
  10. }
  11. $y = new db2('data11');
  12. $y -> delete_db();
  13. ?>

(Отредактировано автором: 24 Августа, 2011 - 14:14:05)



-----
Если все время идти вперед, до цели будет немного ближе..
 
 Top
КЫР
Отправлено: 24 Августа, 2011 - 21:14:11
Post Id



Частый гость


Покинул форум
Сообщений всего: 168
Дата рег-ции: Авг. 2011  
Откуда: Новосибирск


Помог: 2 раз(а)




ты же ошибка с объявление переменной


-----
Fuck you guys, I'll going home
 
 Top
White
Отправлено: 24 Августа, 2011 - 22:07:09
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




КЫР пишет:
private $this->database_name

откуда $this в объявлении переменных? Не понял


-----
if(time()>1356048000) die();
 
 Top
Страниц (2): « 1 [2]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB