Доступ к унаследованной функции невозможен в PHP - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь проиллюстрировать статьи о PHP и построил с этой структурой:

Article

- ChildArticle

Теперь я хочу получить доступ к функции в классе ChildArticleкоторый унаследован от класса Article.

Вот мой класс Article:

<?php
namespace App\Article;
use PDO;
class Articles
{
private $id;
private $name;
private $cid;
private $ordernumber;
private $description;
private $descriptionLong;
private $childArticles;

/**
 * @return mixed
 */
public function getId()
{
    return $this->id;
}

/**
 * @return mixed
 */
public function getName()
{
    return $this->name;
}

/**
 * @return mixed
 */
public function getCid()
{
    return $this->cid;
}

/**
 * @return mixed
 */
public function getOrdernumber()
{
    return $this->ordernumber;
}

/**
 * @return mixed
 */
public function getDescription()
{
    return $this->description;
}
/**
 * @return mixed
 */
public function getDescriptionLong()
{
    return $this->descriptionLong;
}

/**
 * @return mixed
 */
public function getChildArticles()
{
    return $this->childArticles;
}

function readChildArticles(PDO $pdo){
   $stmt = $pdo->prepare(
        "SELECT articleID as id, ordernumber FROM `s_articles_details` WHERE ordernumber LIKE :ordernumberWOD AND ordernumber NOT LIKE :ordernumber"
    );
    $stmt->execute([
        'ordernumberWOD'=>$this->ordernumber.".%",
        'ordernumber'=>$this->ordernumber
    ]);
    $this->childArticles = $stmt->fetchAll(PDO::FETCH_CLASS,"App\\Article\\ChildArticle");

    }


}

Вот мой класс ChildArticle:

class ChildArticle extends Articles
{

}

Теперь я хочу прочитатьпорядковые номера дочерних статей:

    foreach ($article->getChildArticles() as $child){
        echo "Child: {$child->getOrdernumber()}<br>";
    }

Моя функция readChildArticles:

function readChildArticles(PDO $pdo){
   $stmt = $pdo->prepare(
        "SELECT articleID as id, ordernumber FROM `s_articles_details` WHERE ordernumber LIKE :ordernumberWOD AND ordernumber NOT LIKE :ordernumber"
    );
    $stmt->execute([
        'ordernumberWOD'=>$this->ordernumber.".%",
        'ordernumber'=>$this->ordernumber
    ]);
    $this->childArticles = $stmt->fetchAll(PDO::FETCH_CLASS,"App\\Article\\ChildArticle");

}

Мой вывод будет таким:

Child: 
Child:
and so on 

, если я получу порядковый номер через $child-> ordernumber, это работает.

Почему мой класс ChildArticle не принимает функцию в точности так же, как параметры?

И вы можете дать мне подсказку, как я могу решить проблему илигде я могу прочитать об этом?

thx:)

1 Ответ

1 голос
/ 09 мая 2019

Проблема в том, как PDO создает объект: он создает экземпляр класса (ChildArticle), а затем устанавливает все столбцы в качестве свойств для него.Поскольку $ordernumber равно private, это создает отдельное свойство в каждом классе, то есть Article::$ordernumber и ChildArticle::$ordernumber - это два совершенно отдельных свойства.Метод в Article пытается получить доступ к Article::$ordernumber.

Сделать свойство как минимум protected или изменить способ создания экземпляра класса.

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

...