php - 为什么 php 会从不运行的类函数中执行回显?
问题描述
我正在运行以下代码:
class column_field_length_validation extends Controller
{
private $input_column_type;
private $input_column_field_length;
private $input_csv_line_data;
public function __construct ($recieved_input_column_type, $recieved_input_column_field_length, $received_input_csv_line_data)
{
$this->input_column_type = $recieved_input_column_type;
$this->input_column_field_length = $recieved_input_column_field_length;
$this->input_csv_line_data = $received_input_csv_line_data;
}
public function run ()
{
$type_check = $this->input_column_type;
$csv_line_data = $this->input_csv_line_data;
$column_field_length = $this->input_column_field_length;
$type_check_function = [
'string_check' => $this->string_length_check($column_field_length, $csv_line_data),
];
foreach ($type_check_function as $key => $value) {
if ($type_check == $key) {
return $value;
}
}
}
public function string_length_check ($column_field_length, $csv_line_data)
{
$max_string_length = $column_field_length / 3;
$length_check = (strlen($csv_line_data) <= $max_string_length) ? 1 : 0;
echo 'string check preformed = ';
return [
'errors' => $length_check,
];
}
}
我遇到的问题是,当调用此类并且 $type_check 不等于 'string_check' 时,似乎 'string_length_check' 函数没有运行。但是,回声线仍在运行。
上面的类/代码正在通过下面的类代码运行:
class check_csv_data_against_column_types extends Controller
{
public function run(Request $request)
{
$headings_to_check = (new columns_to_be_checked)->run($request);
$table_data = (new return_table_data)->run($request);
$table_name = $table_data['table_name'];
$column_types = $table_data['column_types'];
$column_lengths = $table_data['column_lengths'];
$csv_file = $_FILES['csvfile']['tmp_name'];
$handle = fopen($csv_file, "r");
$csv_data = fgetcsv($handle);
$heading_count = count($headings_to_check['headings']);
$db = DB::table($table_name)->get();
while (! feof($handle)) {
$csv_line = fgetcsv($handle);
for ($i=0; $i < $heading_count; $i++) {
$current_heading = $headings_to_check['headings'][$i];
$current_heading_position = $headings_to_check['positions'][$i];
$current_column_length = $column_lengths[$i];
$column_type_position = $column_types[$current_heading_position];
$line = $csv_line[$current_heading_position] ?? 'empty line break';
if ($line == 'empty line break') {
break;
}
$type_check = (new column_type_check_required($column_type_position))->run();
echo $type_check;
echo nl2br("\r\n");
print_r((new csv_line_data_column_type_validation($type_check, $line))->run());
echo nl2br("\r\n");
print_r((new column_field_length_validation($type_check, $current_column_length, $line))->run());
echo nl2br("\r\n");
}
}
fclose($handle);
}
}
结果或输出如下所示:
int_check
Array ( [errors] => 1 [csv_line_data] => 1 )
EXAMPLE --> string check preformed =
timestamp_check
Array ( [errors] => 1 [csv_line_data] => 2021-04-14 19:47:14 )
string check preformed =
timestamp_check
Array ( [errors] => 1 [csv_line_data] => 2021-04-14 19:47:14 )
string check preformed =
string_check
Array ( [errors] => 1 [csv_line_data] => for sale )
string check preformed = Array ( [errors] => 1 )
int_check
Array ( [errors] => 1 [csv_line_data] => 2 )
string check preformed =
timestamp_check
Array ( [errors] => 1 [csv_line_data] => 2021-04-14 19:47:14 )
string check preformed =
timestamp_check
Array ( [errors] => 1 [csv_line_data] => 2021-04-14 19:47:14 )
string check preformed =
string_check
Array ( [errors] => 1 [csv_line_data] => for rent )
string check preformed = Array ( [errors] => 1 )
int_check
Array ( [errors] => 1 [csv_line_data] => 3 )
string check preformed =
timestamp_check
Array ( [errors] => 1 [csv_line_data] => 2021-04-14 19:47:14 )
string check preformed =
timestamp_check
Array ( [errors] => 1 [csv_line_data] => 2021-04-14 19:47:14 )
string check preformed =
string_check
Array ( [errors] => 1 [csv_line_data] => off market )
string check preformed = Array ( [errors] => 1 )
int_check
Array ( [errors] => 1 [csv_line_data] => 4 )
string check preformed =
timestamp_check
Array ( [errors] => 1 [csv_line_data] => 2021-04-14 19:47:14 )
string check preformed =
timestamp_check
Array ( [errors] => 1 [csv_line_data] => 2021-04-14 19:47:14 )
string check preformed =
string_check
Array ( [errors] => 1 [csv_line_data] => sold (subject to contract) )
string check preformed = Array ( [errors] => 1 )
这不是一个主要问题,但是知道我是否做错了什么或如何解决这个问题会很有帮助。
提前致谢。
解决方案
该代码已运行,因为您将方法作为值调用,那么该数组索引的值是多少?方法的分辨率,因此方法运行。您必须做的是关闭以防止这种情况发生。
所以,这段代码:
$type_check_function = [
'string_check' => $this->string_length_check($column_field_length, $csv_line_data),
];
应该是这样的:
$type_check_function = [
'string_check' => function () use ($column_field_length, $csv_line_data) {
return $this->string_length_check($column_field_length, $csv_line_data);
}
];
然后,你必须改变:
foreach ($type_check_function as $key => $value) {
if ($type_check == $key) {
return $value;
}
}
至:
foreach ($type_check_function as $key => $value) {
if ($type_check == $key) {
return $value();
}
}
因为$value
将是:
function () use ($column_field_length, $csv_line_data) {
return $this->string_length_check($column_field_length, $csv_line_data);
}
因此,它将执行该函数,因此$value()
它将返回$this->string_length_check($column_field_length, $csv_line_data)
.
也许我们必须调整一些东西,但我想我没有错过任何东西。
推荐阅读
- python - Python 创建 __init__.py 以指向正确的子包
- python - 如何将破折号托管的网页变成单个静态 html 页面?
- java - Java:For循环不显示所有输出数字
- android - react native 中是否有用于 instagram auth implimentation 的 NPM 包?(Expo)
- arrays - AutoHotkey:数组和对象范围
- sql - 使用联接过滤查询未返回正确的结果
- python-2.7 - Python pandas 在给定条件下写入 excel
- wordpress - HTTP 500 错误:无法在 AWS ec2 上处理 wordpress 网站的此请求
- php - Laravel/Eloquent 规范化 JSON 响应的关系?
- reactjs - 如何在 ListItemText 中使用显示组件?