PHP:报错Methods with the same name as their class will not be constructors in a future version of PHP

为PHP版本常见问题

错误提示

Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; StringReader has a deprecated constructor in D:\phpstudy_pro\WWW\project\includes\php-gettext\streams.php on line 48

Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; gettext_reader has a deprecated constructor in D:\phpstudy_pro\WWW\project\includes\php-gettext\gettext.php on line 36

 错误分析

这些警告信息表明您正在使用的代码中有一些类构造函数的定义方式在PHP的未来版本中将不再被支持。具体来说,这些警告指的是类的方法名称与类名相同,并且它们被当作构造函数使用,这在PHP 7.x中已经被弃用,并在PHP 8.x中完全移除。

代码修改

初始代码

以streams.php为例

<?php
class StreamReader
{
  // should return a string [FIXME: perhaps return array of bytes?]
  function read($bytes)
  {
    return false;
  }

  // should return new position
  function seekto($position)
  {
    return false;
  }

  // returns current position
  function currentpos()
  {
    return false;
  }

  // returns length of entire stream (limit for seekto()s)
  function length()
  {
    return false;
  }
};

class StringReader
{
  var $_pos;
  var $_str;

  function StringReader($str = '')
  {
    $this->_str = $str;
    $this->_pos = 0;
  }

  function read($bytes)
  {
    $data = substr($this->_str, $this->_pos, $bytes);
    $this->_pos += $bytes;
    if (strlen($this->_str) < $this->_pos)
      $this->_pos = strlen($this->_str);

    return $data;
  }

  function seekto($pos)
  {
    $this->_pos = $pos;
    if (strlen($this->_str) < $this->_pos)
      $this->_pos = strlen($this->_str);
    return $this->_pos;
  }

  function currentpos()
  {
    return $this->_pos;
  }

  function length()
  {
    return strlen($this->_str);
  }
};


class FileReader
{
  var $_pos;
  var $_fd;
  var $_length;

  function FileReader($filename)
  {
    if (file_exists($filename)) {

      $this->_length = filesize($filename);
      $this->_pos = 0;
      $this->_fd = fopen($filename, 'rb');
      if (!$this->_fd) {
        $this->error = 3; // Cannot read file, probably permissions
        return false;
      }
    } else {
      $this->error = 2; // File doesn't exist
      return false;
    }
  }

  function read($bytes)
  {
    if ($bytes) {
      fseek($this->_fd, $this->_pos);

      // PHP 5.1.1 does not read more than 8192 bytes in one fread()
      // the discussions at PHP Bugs suggest it's the intended behaviour
      $data = '';
      while ($bytes > 0) {
        $chunk  = fread($this->_fd, $bytes);
        $data  .= $chunk;
        $bytes -= strlen($chunk);
      }
      $this->_pos = ftell($this->_fd);

      return $data;
    } else return '';
  }

  function seekto($pos)
  {
    fseek($this->_fd, $pos);
    $this->_pos = ftell($this->_fd);
    return $this->_pos;
  }

  function currentpos()
  {
    return $this->_pos;
  }

  function length()
  {
    return $this->_length;
  }

  function close()
  {
    fclose($this->_fd);
  }
};

// Preloads entire file in memory first, then creates a StringReader
// over it (it assumes knowledge of StringReader internals)
class CachedFileReader extends StringReader
{
  function CachedFileReader($filename)
  {
    if (file_exists($filename)) {

      $length = filesize($filename);
      $fd = fopen($filename, 'rb');

      if (!$fd) {
        $this->error = 3; // Cannot read file, probably permissions
        return false;
      }
      $this->_str = fread($fd, $length);
      fclose($fd);
    } else {
      $this->error = 2; // File doesn't exist
      return false;
    }
  }
};

问题分析

 

如上图:类名与方法名一致,故导致问题出现 ,需要将构造函数的命名从类名更改为__construct()

修改后代码 

<?php
// Simple class to wrap file streams, string streams, etc.
// seek is essential, and it should be byte stream
class StreamReader
{
  // should return a string [FIXME: perhaps return array of bytes?]
  function read($bytes)
  {
    return false;
  }

  // should return new position
  function seekto($position)
  {
    return false;
  }

  // returns current position
  function currentpos()
  {
    return false;
  }

  // returns length of entire stream (limit for seekto()s)
  function length()
  {
    return false;
  }
};

class StringReader
{
  var $_pos;
  var $_str;

  function __construct($str = '')
  {
    $this->_str = $str;
    $this->_pos = 0;
  }

  function read($bytes)
  {
    $data = substr($this->_str, $this->_pos, $bytes);
    $this->_pos += $bytes;
    if (strlen($this->_str) < $this->_pos)
      $this->_pos = strlen($this->_str);

    return $data;
  }

  function seekto($pos)
  {
    $this->_pos = $pos;
    if (strlen($this->_str) < $this->_pos)
      $this->_pos = strlen($this->_str);
    return $this->_pos;
  }

  function currentpos()
  {
    return $this->_pos;
  }

  function length()
  {
    return strlen($this->_str);
  }
};


class FileReader
{
  var $_pos;
  var $_fd;
  var $_length;

  function __construct($filename)
  {
    if (file_exists($filename)) {

      $this->_length = filesize($filename);
      $this->_pos = 0;
      $this->_fd = fopen($filename, 'rb');
      if (!$this->_fd) {
        $this->error = 3; // Cannot read file, probably permissions
        return false;
      }
    } else {
      $this->error = 2; // File doesn't exist
      return false;
    }
  }

  function read($bytes)
  {
    if ($bytes) {
      fseek($this->_fd, $this->_pos);

      // PHP 5.1.1 does not read more than 8192 bytes in one fread()
      // the discussions at PHP Bugs suggest it's the intended behaviour
      $data = '';
      while ($bytes > 0) {
        $chunk  = fread($this->_fd, $bytes);
        $data  .= $chunk;
        $bytes -= strlen($chunk);
      }
      $this->_pos = ftell($this->_fd);

      return $data;
    } else return '';
  }

  function seekto($pos)
  {
    fseek($this->_fd, $pos);
    $this->_pos = ftell($this->_fd);
    return $this->_pos;
  }

  function currentpos()
  {
    return $this->_pos;
  }

  function length()
  {
    return $this->_length;
  }

  function close()
  {
    fclose($this->_fd);
  }
};

// Preloads entire file in memory first, then creates a StringReader
// over it (it assumes knowledge of StringReader internals)
class CachedFileReader extends StringReader
{
  function __construct($filename)
  {
    if (file_exists($filename)) {

      $length = filesize($filename);
      $fd = fopen($filename, 'rb');

      if (!$fd) {
        $this->error = 3; // Cannot read file, probably permissions
        return false;
      }
      $this->_str = fread($fd, $length);
      fclose($fd);
    } else {
      $this->error = 2; // File doesn't exist
      return false;
    }
  }
};

In SystemVerilog, constructors in classes do not specify a return type for several key reasons: **1. Implicit Creation of Object Instances** The primary role of a constructor is to initialize an object instance when it is created. When a new object of a class is instantiated using the `new` keyword, the constructor is automatically invoked to set up the object's initial state. Since the constructor is intrinsically linked to the creation of an object of that class, it doesn't need to explicitly return a value. The act of creating the object through the `new` operator already implies that the result is an instance of the class. For example: ```systemverilog class MyClass; int myVar; // Constructor function new(int initValue); myVar = initValue; endfunction endclass module test; MyClass obj; initial begin obj = new(10); // Constructor is called here end endmodule ``` In this code, when `new(10)` is called, the constructor of `MyClass` is executed to initialize the `myVar` member variable. The `new` operator returns an instance of `MyClass`, and the constructor's job is to set up the internal state of that instance, not to return a value. **2. Consistency and Clarity** By not specifying a return type, SystemVerilog maintains consistency and clarity in the syntax related to object creation. It clearly differentiates constructors from regular functions. Regular functions in SystemVerilog must have a specified return type, which indicates what kind of value the function will produce. Constructors, on the other hand, are solely focused on object initialization, and omitting the return - type makes this distinction obvious to the programmer. **3. Language Design Philosophy** The design of SystemVerilog follows the principle of providing a high - level, object - oriented programming environment for hardware design and verification. In object - oriented programming, constructors are a fundamental concept used to ensure that objects are properly initialized. By not allowing a return type for constructors, the language enforces a strict separation between the object creation process and other operations that might return values. This helps in writing more reliable and maintainable code, as it reduces the potential for confusion and errors related to the return values of constructors.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

25号底片~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值