gpt4 book ai didi

php - 返回一个对象得到 true 而不是一个对象

转载 作者:行者123 更新时间:2023-12-04 08:51:47 24 4
gpt4 key购买 nike

我正在编写一个 PHP 脚本,用于将小盒子(简单的矩形)放在一个更大的盒子中。为此,我将代码的 Javascript 版本移植到 PHP。

<?php

class Packer
{
private $box;

/**
* Packer constructor.
* @param int $width
* @param int $height
*/
public function __construct(int $width, int $height)
{
$this->box = new Box($width, $height);
}

/**
* @param $blocks
*/
public function fitBlocksIntoBox($blocks)
{
for ($n = 0; $n < sizeof($blocks); $n++) {
$block = $blocks[$n];
$node = $this->findNode($this->box, $block->width, $block->height);
if ($node) {
$block->fitsInBox = $this->splitNode($node, $block->width, $block->height);
}
}
}

/**
* @param $box
* @param $width
* @param $height
* @return Box|null
*/
private function findNode($box, $width, $height)
{
if ($box->used) {
return $this->findNode($box->right, $width, $height) || $this->findNode($box->down, $width, $height);
} else if (($width <= $box->width) && ($height <= $box->height)) {
return $box;
} else {
return null;
}
}

/**
* @param $node
* @param $width
* @param $height
* @return mixed
*/
private function splitNode($node, $width, $height)
{
$node->used = true;

$bW = $node->width;
$bH = $node->height - $height;
$bX = $node->x;
$bY = $node->y + $height;
$node->down = new Box($bW, $bH, $bX, $bY);

$bW = $node->width - $width;
$bH = $node->height;
$bX = $node->x + $width;
$bY = $node->y;
$node->right = new Box($bW, $bH, $bX, $bY);
return $node;
}

}

class Block
{
public $width;
public $height;
public $fitsInBox;

public function __construct($width, $height) {
$this->width = $width;
$this->height = $height;
}
}

class Box
{
public $x;
public $y;
public $width;
public $height;
public $used;
public $down;
public $right;

public function __construct($width, $height, $x = 0, $y = 0) {
$this->x = $x;
$this->y = $y;
$this->width = $width;
$this->height = $height;
$this->used = false;
$this->right = null;
$this->down = null;
}
}
我像这样运行脚本。
<?php
require_once('Packer.php');
require_once('Box.php');
require_once('Block.php');

$blocks = [
new Block(100, 100),
new Block(50, 50),
new Block(50, 50),
new Block(40, 30)
];

$packer = new Packer(900, 1200);
$packer->fitBlocksIntoBox($blocks);
在第一个循环中,脚本完全符合我的预期。它将第一个块放入框中并计算向下和向右两个新框。
第二个循环产生了问题,我不明白为什么会发生。
函数 findNode 将检查该框是否已在使用中。如果是这样,它将检查是否使用了 box-right 或 box-down 并使用此框调用自己。这有效。在此函数的下一次调用中,它检测到该框未被使用并且该块将适合并返回该框。
结果将存储在函数 fitBlocksIntoBox 中的 $node 中,现在它不再是 Box,结果为真。
调试第一个循环
enter image description here
调试第二个循环 - 从 findNode 返回
enter image description here
调试第二个循环 - fitBlocksIntoBox if($node)...
enter image description here
我通过 XDebug 运行脚本,它告诉我, findNode() 按预期返回 Box。
希望有人对我有所提示,我在这里做错了什么。
谢谢,蒂莫

最佳答案

使用 ?:而不是 || .||在 PHP 中的工作方式与在 JavaScript 中的工作方式不同。
||两人->findNode()如您所见,调用被评估为 bool 值。?:如果“真实”,运算符将返回第一个值,否则返回第二个值。

关于php - 返回一个对象得到 true 而不是一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64065113/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com