Вот мой класс:
class ProfileLink {
function profileLink(PDO $pdo, $string, $i=0)
{
if ($i!=0) {
$link = $string . '-' . $i;
} else {
$link = $string;
}
$req = $pdo->prepare('SELECT link FROM users WHERE link = ?');
$req->execute(array($link));
$nb = $req->rowCount();
$req->closeCursor();
if ($nb > 0) {
$i++;
return profileLink($pdo, $string, $i);
} else {
return $link;
}
}
}
Когда я вызываю функцию profileLink из класса, это не работает, но если я вызываю его вне класса, все в порядке. Возможно, это проблема с PDO, как вы думаете?
require_once ('lib/profileLink.class.php');
$profileLink = new ProfileLink();
$link = $profileLink->profileLink($pdo, $string);
Я бы сохранил экземпляр PDO как свойство класса, чтобы его можно было легко получить в классе. Обратите внимание, что в моем примере используется немного другой синтаксис (современный PHP).
class ProfileLink {
protected $pdo;
public function __construct(PDO $pdo) {
$this->pdo = $pdo;
}
public function profileLink($string, $i=0)
{
if ($i!=0) {
$link = $string . '-' . $i;
} else {
$link = $string;
}
$req = $this->pdo->prepare('SELECT link FROM users WHERE link = ?');
$req->execute(array($link));
$nb = $req->rowCount();
$req->closeCursor();
if ($nb > 0) {
$i++;
return profileLink($string, $i);
} else {
return $link;
}
}
}
$profileLink = new ProfileLink($pdo);
2 вещи:
Вот
return profileLink($pdo, $string, $i);
вам не хватает $this
, потому что это не регулярная функция, а метод класса:
return $this->profileLink($pdo, $string, $i);
И, во-вторых, ваш метод имеет то же имя, что и класс (кроме первой заглавной буквы) и, следовательно, интерпретируется как конструктор. Я только что испытал это:
class Test {
function test() {
echo "test";
}
}
$t = new Test();
И он выводит "test"
.
Поэтому вы должны переименовать свой метод в getLink
или что-то подобное.