【问题标题】:Creating objects from classes in PHP results with objects with same data从 PHP 中的类创建对象会导致对象具有相同的数据
【发布时间】:2014-07-07 21:52:50
【问题描述】:

我的课程有问题。我写了一个班级项目。当我从这个类创建对象时,创建一个没有问题,但是更多的对象会导致使用上一个对象的数据初始化所有以前的对象。

这就是我创建对象的方式:

$a = new Item(1, 111, 123, "Laptop", "NOT HP ProBook 450 G1, E9Y47EA", "kom.", 1, 20500, 25000, 18, 12, 1);

因此,如果我将其打印到屏幕上,一切都会好起来的,ti 将给出以下信息:

Item: | 00001 | Laptop___________________ NOT HP ProBook 450 G1, E9Y47EA____________________ | Units: kom. Availability: 0001 - 20.500,00 - 25.000,00 || G: 12 months

但如果我创建另一个 Item 对象:

$b = new Item(2, 222, 456, "DESKTOP", "blah", "kom.", 2, 41000, 46000, 18, 12, 1);

当回应他们时,我得到:

Item: | 00002 | DESKTOP__________________ blah______________________________________________ | Units: kom. Availability: 0002 - 41.000,00 - 46.000,00 || G: 12 months

Item: | 00002 | DESKTOP__________________ blah______________________________________________ | Units: kom. Availability: 0002 - 41.000,00 - 46.000,00 || G: 12 months

如您所见,看起来它们都使用相同的数据进行了初始化。

任何人,有什么想法吗?

提前致谢!

require_once("item.interface.php");
require_once("../conf/numberFormat.config.php");

//class item

class Item implements iItem
{
private static $id; //int
private static $cipher; //int
private static $serialNumber; //big int
private static $name; //string
private static $description; //text
private static $unit; //measurment unit
private static $quantity; //int
private static $price; //double
private static $recomendedPrice; //double
private static $vat; //tiny int
private static $guarantee; //tiny int
private static $warehouse; //small int

//formatting
private static $decimalPoint;
private static $decimals;
private static $thousandSeparator;

public function Item($id, $cipher, $serialNumber, $name, $description, $unit,       $quantity, $price, $recomendedPrice,
    $vat, $guarantee, $warehouse)
{
    self::$id = $id;
    self::$cipher = $cipher;
    self::$serialNumber = $serialNumber;
    self::$name = $name;
    self::$description = $description;
    self::$unit = $unit;
    self::$quantity = $quantity;
    self::$price = $price;
    self::$recomendedPrice = $recomendedPrice;
    self::$vat = $vat;
    self::$guarantee = $guarantee;
    global $decimalPoint;
    self::$decimalPoint = $decimalPoint;
    global $decimals;
    self::$decimals = $decimals;
    global $thousandSeparator;
    self::$thousandSeparator = $thousandSeparator;
    self::$warehouse = $warehouse;
}

//set methods
public function setId($id)
{
    self::$id = $id;
}

public function setCipher($cipher)
{
    self::$cipher = $cipher;
}

public function setSerialNumber($serialNumber)
{
    self::$serialNumber = $serialNumber;
}

public function setName($name)
{
    self::$name = $name;
}

public function setDescription($description)
{
    self::$description = $description;
}

public function setUnit($unit)
{
    self::$unit = $unit;
}

public function setQuantity($quantity)
{
    self::$quantity = $quantity;
}

public function setPrice($price)
{
    self::$price = $price;
}

public function setRecomendedPrice($recomendedPrice)
{
    self::$recomendedPrice = $recomendedPrice;
}

public function setVat($vat)
{
    self::$vat = $vat;
}

public function setGuarantee($guarantee)
{
    self::$guarantee = $guarantee;
}

public function setWarehouse($warehouse)
{
    self::$warehouse = $warehouse;
}

//get methods
public function getId()
{
    return self::$id;
}

public function getCipher()
{
    return self::$cipher;
}

public function getSerialNumber()
{
    return self::$serialNumber;
}

public function getName()
{
    return self::$name;
}

public function getDescription()
{
    return self::$description;
}

public function getUnit()
{
    return self::$unit;
}

public function getQuantity()
{
    return self::$quantity;
}

public function getPrice()
{
    return self::$price;
}

public function getRecomendedPrice()
{
    return self::$recomendedPrice;
}

public function getVat()
{
    return self::$vat;
}

public function getGuarantee()
{
    return self::$guarantee;
}

public function getWarehouse()
{
    return self::$warehouse;
}

//other methods
public function toString()
{
    global $ITEM;
    return ucfirst($ITEM).": | " . sprintf("%05d", self::$id) . " | " . STR_PAD(self::$name, 25, "_") .
        " <i>" . STR_PAD(self::$description, 50, "_") . "</i> | Units: ".self::$unit." Availability: " .
        sprintf("%04d", self::$quantity) . " - " . self::formatPrice(self::$price) .
        " - " . self::formatPrice(self::$recomendedPrice) . " || G: " . self::$guarantee .
        " months";
}

public function toHTML()
{
    return false;
}

private function formatPrice($input)
{
    return number_format($input, self::$decimals, self::$decimalPoint, self::$thousandSeparator);
}
}

【问题讨论】:

  • 您的所有属性都是static,这意味着它们由类的所有元素共享。如果您希望每个对象都有自己的值,为什么要声明它们是静态的?
  • @Dean BTW,看看this SO thread
  • 关于一个完全不相关的问题:您的构造函数非常长。请阅读干净的代码和/或最佳实践,您将帮助您未来的自己和其他必须使用您的代码的人
  • @kingkero 你能推荐我阅读吗?
  • @Dean 正如我所说,Clean Code 使用 Java 进行演示;)我敢肯定,如果您搜索“php 最佳实践”,您会发现更多资源(我不知道更多在那本书旁边..)

标签: php arrays class oop object


【解决方案1】:

这是由于您的属性(变量)是静态的。

阅读类属性

http://www.php.net/manual/en/language.oop5.properties.php

【讨论】:

  • 我建议包含更多关于关键字staticself$this的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-30
  • 1970-01-01
  • 1970-01-01
  • 2017-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多