PHP, как передать переменную внутри класса - PullRequest
0 голосов
/ 12 октября 2019

Я попробовал решения, указанные здесь для stackoverflow, в приведенном ниже коде используется один из них, рекомендованный и выбранный как правильный способ сделать это, но он не работает для меня, почему? На самом деле результаты href пустые.

<?php

//URLS LIST
$nameA = 'http://www.example.com';
$nameB = 'http://www.example.com';
$nameC = 'http://www.example.com';

class bannClass {

    private $class_varA;
    private $class_varB;
    private $class_varC;

    public $username = '';
    public function __construct($nameA, $nameB, $nameC) {
      $this->class_varA = $nameA;
      $this->class_varB = $nameB;
      $this->class_varC = $nameC;
    }
    public function check_userOne() {
      $url = 'https://example.com/wp-content/uploads/sponsor/' . $this->username . '/sponsor1.jpg';
      return '<a href="' . $this->class_varA . '" target="_blank" rel="noopener noreferrer"><img src="' . $url . '" alt="Sponsor"/></a>';
    }
    public function check_userTwo() {
      $url = 'https://example.com/wp-content/uploads/sponsor/' . $this->username . '/sponsor2.jpg';
      return '<a href="' . $this->class_varB . '" target="_blank" rel="noopener noreferrer"><img src="' . $url . '" alt="Sponsor"/></a>';
    }
    public function check_userThree() {
      $url = 'https://example.com/wp-content/uploads/sponsor/' . $this->username . '/sponsor3.jpg';
      return '<a href="' . $this->class_varC . '" target="_blank" rel="noopener noreferrer"><img src="' . $url . '" alt="Sponsor"/></a>';
    }
}

Кроме того, как я могу сделать эти 3 переменные на верхнем динамическом в php? вместо «name» что-то вроде $($this->username . 'A'), $($this->username . 'B') и т. д.

EDIT: приведенный выше экземпляр создается в другом php-файле, например:

<?php

require_once('myclass.php');
$bannClass = new bannClass();
$bannClass->username = $data['username'];

//etc.

и используется как:

<?php echo $bannClass->check_userOne();?>

Ответы [ 2 ]

2 голосов
/ 12 октября 2019

Как написано, вы должны ввести 3 значения при его создании. Если в вашей среде разработки включены отчеты об ошибках (и вы действительно должны это делать), он бы пожаловался, что вы создали его экземпляр как $bannClass = new bannClass();

Вот как должен создаваться этот объект:

$nameA = 'http://www.example.com';
$nameB = 'http://www.example.com';
$nameC = 'http://www.example.com';

$bannClass = new bannClass($nameA, $nameB, $nameC);

Я бы сделал несколько предложений:

  1. Не смешивайте логику и представление. Хорошее практическое правило - не использовать html вне представления. Объекты обычно для логики, а не для форматирования HTML. Оставьте html для вспомогательных функций и часть скрипта «view» (что должно быть последним, что происходит)
  2. Держите его СУХИМ (не повторяйте себя). Если у вас есть методы, делающие то же самое, пришло время провести рефакторинг. Передайте переменную или массив для метода для работы.

—-

Дальнейшие идеи, связанные с вашим комментарием:

Сбор URL-адресов обычно является работой объекта. (Посмотрите на объект PDO. Полезная ссылка )

Во всех моих проектах я использую объект (с именем Database), чтобы обернуть вокруг доступа к базе данных php, аналогично pdo. Он включает в себя следующие 3 метода (код для краткости опущен):

public function prepare(string $query) { ... }
public function execute(array $params) { ... }
public function nextRecord() {...}

В процедурном сценарии вы должны сначала выполнить любую инициализацию, необходимую для любого пользовательского ввода, используя PRG шаблон и любая другая логика. Затем вы должны вывести html, используя php только для зацикливания и вставки переменных. В терминах ООП это примерно соответствует шаблону MVC (который стоит изучить).

Итак, для примера предположим, что у нас есть база данных URL:

ID   URL       Image
1    foo.com   Image1.com
2    bar.com   Image2.com
3    baz.com   Image3.com

Процедурный сценарий может выглядеть следующим образом:

<?php
require(‘database.php’);

// optionally deal with user input

$url = new Database;  // example is assuming connection is handled in the object
$url->prepare(“select url, image from sometable”);
$url->execute();

// all logic is complete; now give the output 
?>
<!— html stuff —>
<ul>
<?php while($row=$url->nextRecord() ): ?>
    <li><a href=“<?= $row->url ?>" target="_blank" rel="noopener noreferrer"><img src="<?= $row->image ?>" alt="Sponsor"/></a></li>
    <?php endwhile; ?>
</ul>

По общему признанию,Я не объяснил свою цель;пространство не позволяет. Но это должно дать вам обзор того, что возможно и как отобразить 150 URL, не повторяя себя.

0 голосов
/ 12 октября 2019

Просто добавьте к отличному ответу Тим Мортон : Предположим, что три ссылки почти всегда одинаковы, тогда вы можете сделать что-то вроде этого:

class bannClass {

    private $class_varA = 'https://example.com';
    private $class_varB = 'https://example.com';
    private $class_varC = 'https://example.com';

    public $username = '';
    public function __construct($nameA = null, $nameB = null, $nameC = null) {
      if (!empty($nameA)) $this->class_varA = $nameA;
      if (!empty($nameB)) $this->class_varB = $nameB;
      if (!empty($nameC)) $this->class_varC = $nameC;
    }

    public function getVarA(){
      return $this->class_varA;
    }

    public function getVarB(){
      return $this->class_varB;
    }

    public function getVarC(){
      return $this->class_varC;
    }

}

То, что выше, означает, что если класс не вызывается с какими-либо параметрами = $foo = new bannClass();, он будет по умолчанию для всех трех URL-адресов иметь значение по умолчанию. Очевидно, вы должны расположить переменные таким образом, чтобы первый из них, возможно, изменялся чаще всего:

$bar = new bannClass('https://stackoverflow.com');
echo $bar->getVarA(); // returns stackoverflow.com
echo $bar->getVarC(); // returns example.com

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

$baz = new bannClass(null,null,'https://stackoverflow.com');
cho $baz->getVarA(); // returns example.com
echo $baz->getVarC(); // returns stackoverflow.com
...