Основной PHP OOPS Query - PullRequest
       1

Основной PHP OOPS Query

0 голосов
/ 12 марта 2011

Хорошо.Я начинаю OOPS в PHP.Создана пара классов: customer (родительский) и sales (дочерний), который наследуется от родительского класса.Создан еще один файл testcustomer.php, в котором создается новый объект продаж, однако функция salesprint (), определенная в классе продаж, не отображает имя клиента, хотя в class.customer.php (parent) она установлена ​​как «Jane».Я думаю, что когда класс продаж расширяет класс клиента, PHP автоматически включает весь код от class.customer.php до sales.customer.php, и поэтому конструктор в родительском классе устанавливает $ name в «Jane».

Вот код: class.customer.php

   <?php

     class customer{

       private $name;
       private $cust_no;

     public function __construct($customerid) {

        $this->name = 'Jane';
        $this->cust_no = $customerid;

       }

    }
  ?>

class.sales.php

    <?php

        require_once('class.customer.php');
        class sales extends customer{

        public function salesprint($customerid) {
    echo "Hello $this->name this is a print of your purchased products";

        }

     }

   ?>

testcustomer.php

      require_once('class.sales.php');
      $objsales = new sales(17);
      $objsales->salesprint(17);

      ?>

Вывод, который я получаю Здравствуйте, это отпечаток вашей купленной продукции.

Что я делаю не так?спасибо Ромеш

Ответы [ 6 ]

2 голосов
/ 12 марта 2011

Помимо того, что расширение класса Customer до продажи не имеет смысла, оно ничего не показывает, потому что имя члена private private означает , недоступное вне текущего класса ни его дочерним элементам , если Вы хотите защитить своего участника, но сделать его доступным для вашего расширенного класса, вам следует использовать ключевое слово protected.

Кстати, когда вы используете переменную в строке, вы должны скорее объединить :

echo 'Hello ' . $this->name . ' this is a print of your purchased products';

или использовать подстановку переменных:

echo "Hello {$this->name} this is a print of your purchased products";

Это более читабельно.

1 голос
/ 11 ноября 2011

Лучше вы можете прочитать http://Confuseoops.blogspot.com.Много примеров там

, когда когда-либо люди пытаются учить ООП?Они запутают их сами по ключевому слову и дизайну patten

1 голос
/ 12 марта 2011

Поскольку поле $name объявлено как private, оно не наследуется подклассу. Измените его на protected.

Кроме того, я бы посоветовал вам сделать то же самое для поля $cust_no. Делая это, вы избежите передачи $customerid в качестве аргумента методу salesprint, и, следовательно, ваш окончательный код будет выглядеть так:

$objsales = new sales(17);
$objsales->salesprint();
0 голосов
/ 12 марта 2011

Хорошо, спасибо всем ... переход от частного к защищенному решил это за меня ... поскольку некоторые жаловались, что дизайн программы неправильный, но это было просто для проверки моего понимания того, как наследование в PHP работает и как PHP будет включать в себя родительский код класса в код дочернего класса во время выполнения. Не было никакого намерения уделять внимание дизайну приложения ... но все же об этом стоит помнить в будущем ... НАЗАД В БУДУЩЕЕ >>>

0 голосов
/ 12 марта 2011

2 проблемы. Ваш суперкласс имеет закрытые переменные, поэтому только этот класс может получить доступ к этим переменным. Используйте защищенный или публичный. Также эта строка неверна, так как работает метод доступа $ this.

echo "Hello ".$this->name. " this is a print of your purchased products";
0 голосов
/ 12 марта 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...