Если мы рассмотрим общие сценарии, в которых может быть выбрано это исключение, доступ к свойствам с объектом вверху.
Пример:
string postalcode=Customer.Address.PostalCode;
//if customer or address is null , this will through exeption
здесь, если адрес имеет значение null, то вы получите NullReferenceException.
Итак, в качестве практики мы всегда должны использовать проверку нуля, прежде чем обращаться к свойствам в таких объектах (особенно в общих)
string postalcode=Customer?.Address?.PostalCode;
//if customer or address is null , this will return null, without through a exception
Второй параметр bindParam является ссылкой . Поскольку возврату функции нельзя ссылаться, она не может строго соответствовать потребностям параметра bindParam (PHP будет работать с вами, хотя и будет выдавать предупреждение здесь).
Чтобы получить лучшую идею, вот и Пример: этот код даст те же результаты, что и ваш второй пример:
$stmt = $dbh->prepare("SELECT thing FROM table WHERE color = :color");
$tempColor = NULL; // assigned here
$stmt->bindParam(':color',$tempColor);
$tempColor = $someClass->getColor(); // but reassigned here
$stmt->execute();
Это невозможно при возврате функции.
Если вы действительно хотите привязать значение вместо ссылки, вы можете использовать PDOStatement :: bindValue , а затем код будет выглядеть примерно так:
$stmt = $dbh->prepare("SELECT thing FROM table WHERE color = :color");
$stmt->bindValue('color', $someObject->getColor());
$stmt->execute();
Если вы хотите избежать назначения значения переменной, вам может быть лучше попробовать:
$stmt = $dbh->prepare("SELECT thing FROM table WHERE color = ?");
$stmt->execute(array($someClass->getColor()));
Как уже упоминалось, ошибка вызвана тем, что PDO :: statement- > bindParam ожидает, что param 2 будет переменной, переданной по ссылке.
В описании PDOStatement::bindParam()
указано, что он связывает переменную PHP с quesitonmark или с именем placeholder. Поскольку вы пытаетесь передать метод класса (даже если этот метод возвращает значение), он все равно не является именем переменной, поэтому это предупреждение. Возможно, вы захотите посмотреть PDOStatement::bindValue()
на будущий код вашего кода.