За последние 24 часа нас посетили 59913 программистов и 1772 робота. Сейчас ищут 796 программистов ...

Объединение двух классов в один

Тема в разделе "PHP для новичков", создана пользователем skillful, 20 июн 2011.

  1. skillful

    skillful Активный пользователь

    С нами с:
    30 ноя 2010
    Сообщения:
    73
    Симпатии:
    0
    Здравствуйте!

    Есть вот такой код:
    PHP:
    1. class a
    2. {
    3.     function __construct()
    4.     {
    5.         $this->b[] = "aaa";
    6.         $this->b[] = "bbb";
    7.         $this->b[] = "ccc";
    8.     }
    9.  
    10.     function one()
    11.     {
    12.         $errTextSpisok = "";
    13.         foreach($this->b as $err)
    14.         {
    15.             $errTextSpisok.= "<li>".$err."</li>";
    16.         }
    17.  
    18.         return $errTextSpisok;
    19.     }
    20. }
    21.  
    22. $a = new a();
    23. echo $a->one();
    который работает и выводит список
    * aaa
    * bbb
    * ccc

    Как заставить работать этот класс точно так же как и раньше, если вместо
    PHP:
    1. $a = new a();
    2. echo $a->one();
    прописать
    PHP:
    1. echo a::one();
    2.  
     
  2. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    В лоб:
    PHP:
    1. <?php
    2. class a
    3.  {
    4.      static private $b=array();
    5.      static public function one()
    6.      {
    7.          self::b[] = "aaa";
    8.          self::b[] = "bbb";
    9.          self::b[] = "ccc";
    10.  
    11.          $errTextSpisok = "";
    12.          foreach(self::b as $err)
    13.          {
    14.              $errTextSpisok.= "<li>".$err."</li>";
    15.          }
    16.  
    17.          return $errTextSpisok;
    18.      }
    19.  }
    Чуть изменив:

    PHP:
    1. <?php
    2. class a
    3.  {
    4.      static public function one()
    5.      {
    6.          $b=array("aaa", "bbb", "ccc");
    7.  
    8.          $errTextSpisok = "";
    9.          foreach($b as $err)
    10.          {
    11.              $errTextSpisok.= "<li>".$err."</li>";
    12.          }
    13.  
    14.          return $errTextSpisok;
    15.      }
    16.  }
     
  3. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    если метод вызывать как статику - в нем не будет $this

    Если хочешь подобный функционал - объявляй $b как static $b, а в методе вызывай через self::$b

    Естественно конструктор не будет отрабатывать при статическом вызове.
     
  4. skillful

    skillful Активный пользователь

    С нами с:
    30 ноя 2010
    Сообщения:
    73
    Симпатии:
    0
    Volt(220)
    В лоб и полбу... массив $b=array("aaa", "bbb", "ccc"); Не нужен мне

    PHP:
    1. function __construct($text)
    2. {
    3.     $this->b[] = $text;
    4. }

    __construct и есть массив
     
  5. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Ну кто ж знал. =)

    __construct - это метод. =)
     
  6. skillful

    skillful Активный пользователь

    С нами с:
    30 ноя 2010
    Сообщения:
    73
    Симпатии:
    0
    Ладно опустим метод, код такой

    PHP:
    1. class a
    2. {
    3.      
    4.      var $returnErr = "";
    5.      
    6.      static private $_error=array();
    7.      static public function one()
    8.      {
    9.          
    10.          $this->_error("aaa");
    11.          $this->_error("bbb");
    12.          $this->_error("ccc");
    13.          
    14.          return $this->_printErrors();
    15.      }
    16.      
    17.      
    18.     function _error($text)
    19.     {
    20.         $this->returnErr[] = $text;
    21.     }
    22.  
    23.     function _printErrors()
    24.     {
    25.         $errTextSpisok = "";
    26.         foreach($this->returnErr as $err)
    27.         {
    28.              $errTextSpisok.= "<li>".$err."</li>";
    29.         }
    30.  
    31.         return $errTextSpisok;
    32.     }
    33. }
    34.  
    35. echo a::one();
     
  7. skillful

    skillful Активный пользователь

    С нами с:
    30 ноя 2010
    Сообщения:
    73
    Симпатии:
    0
    Что нерешаемо?
     
  8. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    А в чем проблема?
     
  9. skillful

    skillful Активный пользователь

    С нами с:
    30 ноя 2010
    Сообщения:
    73
    Симпатии:
    0
    )) я ж говорю, массив в функции one не нужен

    В посте №285246 я написал код который нужно изменить чтоб заработало... Поможешь?
     
  10. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    1) Какие ошибки выдает?
    2) Смотри ответ tommyangelo
     
  11. skillful

    skillful Активный пользователь

    С нами с:
    30 ноя 2010
    Сообщения:
    73
    Симпатии:
    0
    Fatal error: Access to undeclared static property: a::$returnErr in index.php on line ___001
    tommyangelo вообще не понятно ничего написал, мне сам код нужен, а не объяснение...
    Форум же PHP для новичков
    Запустите код на компе, сами все увидите...
     
  12. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    1)Переводи ошибку. Разбирайся из-за чего она. Устраняй причину.
    2)Придется понять, иначе вопросы будут возникать все время. Прежде всего пойми разницу между статическими свойствами/методами и обычными.
     
  13. skillful

    skillful Активный пользователь

    С нами с:
    30 ноя 2010
    Сообщения:
    73
    Симпатии:
    0
    вот не могу понять статистические методы...
     
  14. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Вот именно! Т.е. основная задача научить новичка, а не преподнести ответ.
    В ломмм...
     
  15. skillful

    skillful Активный пользователь

    С нами с:
    30 ноя 2010
    Сообщения:
    73
    Симпатии:
    0
    Первоначальное решение проблемы сразу (почти) правильно дал, а запустить вломмм... Работы на 2 минуты для Вас... Все равно спасибо
     
  16. skillful

    skillful Активный пользователь

    С нами с:
    30 ноя 2010
    Сообщения:
    73
    Симпатии:
    0
    Еще будут решения?
     
  17. skillful

    skillful Активный пользователь

    С нами с:
    30 ноя 2010
    Сообщения:
    73
    Симпатии:
    0
    Такой вот код получился. Спасибо за помощь
    PHP:
    1.  
    2. <?php
    3. class a
    4. {
    5.      static private $errors = 0;
    6.      static private $_error='';
    7.      static private $returnErr='';
    8.      static public function one()
    9.      {
    10.          self::_error("aaa");
    11.          self::_error("bbb");
    12.          self::_error("ccc");
    13.  
    14.          return a::_printErrors();
    15.      }
    16.  
    17.      function _error($text)
    18.      {
    19.          self::$errors++;
    20.          self::$returnErr[] = $text;
    21.      }
    22.  
    23.      function _printErrors()
    24.      {
    25.          $errTextSpisok = "";
    26.          foreach(self::$returnErr as $err)
    27.          {
    28.              $errTextSpisok.= "<li>".$err."</li>";
    29.          }
    30.  
    31.          return $errTextSpisok.'<br>'.self::$errors;
    32.      }
    33.  }
    34.  
    35. echo a::one();
    36. ?>
    37.