无法初始化 \AsyncMysqlQueryResult 对象
Can't initialise \AsyncMysqlQueryResult object
我只想初始化 \AsyncMysqlConnectionResult $connec;
对象
<?hh
namespace Connection;
require_once("ini.php");
/**
* Class for execute and fetch query
*/
class MyQuery
{
/**
* if connection isn't valid recreate pool
*/
private ?\AsyncMysqlConnectionPool $pool;
/**
* \AsyncMysqlConnection object, store $conn
*/
private \AsyncMysqlConnection $connec;
/**
* \AsyncMysqlQueryReturn object, store return query
*/
private \AsyncMysqlQueryResult $result;
/**
* check if $conn object isValid(), if not release
* connection
*/
public function __construct(\AsyncMysqlConnection $conn)
{
if ($conn->isValid() == false)
{
$this->pool = new MyPool();
$this->connec = $this->pool->connect();
}
else
$this->connec = $conn;
$this->result = object;
}
/**
* escape query and execute it
*/
public async function query(string $query): Awaitable<\AsyncMysqlQueryResult>
{
$query = $this->connec->escapeString($query);
echo "Query escape\n";
/* Try to execute the query, if fail display error */
try
{
$this->result = await $this->connec->query($query);
//log request with ini
}
catch (Exception $e)
{
echo "Couldn't execute the request, error with message :<br>";
var_dump($e->getMessage());
//log request with fail
}
echo "Query done succefully\n";
return $this->result;
}
/**
* escape Map array and execute the request
*/
public async function queryf(HH\FormatString<HH\SQLFormatter> $query, array<string> $params): Awaitable<\AsyncMysqlQueryResult>
{
$i = 0;
while ($params[$i++])
$params[$i] = $this->connec->escapeString($params[$i]);
/* Try to execute the query, if fail display error */
try
{
$result = await $this->connec->queryf($query, implode(', ', $params));
//log request with ini
}
catch (Exception $e)
{
echo "Couldn't execute the request, error with message :<br>";
var_dump($e->getMessage());
//log request with fail
}
echo "Query done succefully\n";
return $this->result;
}
}
newtype AsyncMysqlConnectionResult = object;
newtype FormatString<T> = string;
async function simple_query(\AsyncMysqlConnection $conn): Awaitable<Vector>
{
$connec = new MyQuery($conn);
$ret = await $connec->query('SELECT * FROM users');
return $ret->vectorRows();
}
function run_query(\AsyncMysqlConnection $conn): void
{
$r = \HH\Asio\join(simple_query($conn));
var_dump($r);
}
run_query($conn);
为了拥有这个对象,我使用 https://docs.hhvm.com/hack/reference/class/AsyncMysqlConnectionPool/connect/ class 和 connect() 方法来拥有这个:\AsyncMysqlConnectionResult $connec object.
我找不到初始化此变量类型的方法,我已尝试
创建新类型 AsyncMysqlConnectionResult = object 但 filechecker return 我:
Unbound name: Connection\object (an object type)
为什么您的查询方法不直接 return 结果,而不是将结果存储在 class 上。例如:
public async function query(string $query): Awaitable<\AsyncMysqlQueryResult>
{
$query = $this->connec->escapeString($query);
return await $this->connec->query($query);
}
或者如果您确实希望将结果存储在 class 上,请将其设置为可为空。这将允许您不在构造函数中设置它,并且仅在进行查询后才设置它。
private ?\AsyncMysqlQueryResult $result;
这是找到重写 queryf() 方法的唯一方法。
public async function queryf($query, array<int, string> $params): Awaitable<\AsyncMysqlQueryResult>
{
$result = "";
/* Try to execute the query, if fail display error */
try // execute query
{
$result = await $this->connec->queryf($query, implode(', ', $params));
// If log_request === TRUE log request with ini
if ($this->log_request === TRUE)
await $this->logRequest($query, 0);
}
catch (Exception $e) // If the query can't be execute display error
{
echo "\nCouldn't execute the request, error with message :<br>\n";
var_dump($e->getMessage());
//log request with fail
await $this->logRequest((string)$query, -1);
}
return (object)$result;
}
我没有错误,一切正常。
如果有人有更好的解决方案,我就在这里。
我只想初始化 \AsyncMysqlConnectionResult $connec;
对象
<?hh
namespace Connection;
require_once("ini.php");
/**
* Class for execute and fetch query
*/
class MyQuery
{
/**
* if connection isn't valid recreate pool
*/
private ?\AsyncMysqlConnectionPool $pool;
/**
* \AsyncMysqlConnection object, store $conn
*/
private \AsyncMysqlConnection $connec;
/**
* \AsyncMysqlQueryReturn object, store return query
*/
private \AsyncMysqlQueryResult $result;
/**
* check if $conn object isValid(), if not release
* connection
*/
public function __construct(\AsyncMysqlConnection $conn)
{
if ($conn->isValid() == false)
{
$this->pool = new MyPool();
$this->connec = $this->pool->connect();
}
else
$this->connec = $conn;
$this->result = object;
}
/**
* escape query and execute it
*/
public async function query(string $query): Awaitable<\AsyncMysqlQueryResult>
{
$query = $this->connec->escapeString($query);
echo "Query escape\n";
/* Try to execute the query, if fail display error */
try
{
$this->result = await $this->connec->query($query);
//log request with ini
}
catch (Exception $e)
{
echo "Couldn't execute the request, error with message :<br>";
var_dump($e->getMessage());
//log request with fail
}
echo "Query done succefully\n";
return $this->result;
}
/**
* escape Map array and execute the request
*/
public async function queryf(HH\FormatString<HH\SQLFormatter> $query, array<string> $params): Awaitable<\AsyncMysqlQueryResult>
{
$i = 0;
while ($params[$i++])
$params[$i] = $this->connec->escapeString($params[$i]);
/* Try to execute the query, if fail display error */
try
{
$result = await $this->connec->queryf($query, implode(', ', $params));
//log request with ini
}
catch (Exception $e)
{
echo "Couldn't execute the request, error with message :<br>";
var_dump($e->getMessage());
//log request with fail
}
echo "Query done succefully\n";
return $this->result;
}
}
newtype AsyncMysqlConnectionResult = object;
newtype FormatString<T> = string;
async function simple_query(\AsyncMysqlConnection $conn): Awaitable<Vector>
{
$connec = new MyQuery($conn);
$ret = await $connec->query('SELECT * FROM users');
return $ret->vectorRows();
}
function run_query(\AsyncMysqlConnection $conn): void
{
$r = \HH\Asio\join(simple_query($conn));
var_dump($r);
}
run_query($conn);
为了拥有这个对象,我使用 https://docs.hhvm.com/hack/reference/class/AsyncMysqlConnectionPool/connect/ class 和 connect() 方法来拥有这个:\AsyncMysqlConnectionResult $connec object.
我找不到初始化此变量类型的方法,我已尝试
创建新类型 AsyncMysqlConnectionResult = object 但 filechecker return 我:
Unbound name: Connection\object (an object type)
为什么您的查询方法不直接 return 结果,而不是将结果存储在 class 上。例如:
public async function query(string $query): Awaitable<\AsyncMysqlQueryResult>
{
$query = $this->connec->escapeString($query);
return await $this->connec->query($query);
}
或者如果您确实希望将结果存储在 class 上,请将其设置为可为空。这将允许您不在构造函数中设置它,并且仅在进行查询后才设置它。
private ?\AsyncMysqlQueryResult $result;
这是找到重写 queryf() 方法的唯一方法。
public async function queryf($query, array<int, string> $params): Awaitable<\AsyncMysqlQueryResult>
{
$result = "";
/* Try to execute the query, if fail display error */
try // execute query
{
$result = await $this->connec->queryf($query, implode(', ', $params));
// If log_request === TRUE log request with ini
if ($this->log_request === TRUE)
await $this->logRequest($query, 0);
}
catch (Exception $e) // If the query can't be execute display error
{
echo "\nCouldn't execute the request, error with message :<br>\n";
var_dump($e->getMessage());
//log request with fail
await $this->logRequest((string)$query, -1);
}
return (object)$result;
}
我没有错误,一切正常。 如果有人有更好的解决方案,我就在这里。