小编Ste*_*ong的帖子

将过程PHP转换为面向对象的PHP

我目前有一个相当大的应用程序完全用程序PHP编写.我希望进一步提高我的PHP体验,并使用面向对象技术重新编写我的大部分应用程序.

OOP有很多方面可以帮助减少代码量并使其更易于阅读.但是,我有几个问题.

1)据我所知,一个类被用作任意数量对象的蓝图,但任何一个类只代表一个对象,永远不会超过一个.因此,一个班级可以代表一个玩家,但从不代表多个玩家.

2)因为我要包含很多不同的类,我是否使用"Loader"类来加载它们spl_autoload_register或者我只是spl_autoload_register在我的应用程序的程序文件中使用?

编辑:所以我的自动加载器将是一个类,然后我创建一个启动自动加载的实例或只是一个带有该函数和我将包含的spl_autoload_register的php文件,以避免在多个文件中重复相同的代码?

3)我的一些课程依赖于其他课程.我以前从未遇到过这个,所以老实说我不知道​​答案.如果我包括我的主程序文件中的所有类,但我的播放器类并没有包括它需要的功能类,会因为主程序球员类的工作包括哪些球员依赖于类?

编辑:所以即使一个类可以实例化一个类型为Player的对象,并且该类没有直接包含Player类,它仍然可以工作,因为控制器类确实包含了Player类?

4)在多种情况下,我需要处理我正在创建的对象.我想知道我应该怎么做.例如,在我的Player类中,我有时需要从一个Player向另一个Player发送一些东西.那么,我是否在Player类中实现一个静态方法,该方法将两个Players作为参数并进行传输或者我还要做其他事情?

编辑:好的,所以避免使用静态方法.现在我遇到了一个严重的问题:我的应用程序中有多次运行的方法,但是我无法将它们作为静态方法实现.我应该将它们作为实例方法实现吗?例如,从一个播放器发送到另一个播放器.我是否会创建一个实例方法来获取Player对象并将其发送它或从中发送?

5)我有很多方法并不真正属于任何一个类的实例,它们也不适合作为静态方法.这些是否应该作为Common或类似的静态方法在自己的类中声明?在这种情况下,在实践中做了什么?

编辑:这些方法是否属于使用它们的特定应用程序文件,或者可能存储在自己的"functions.php"文件中?

6)我想学习如何使用命名空间,但我的代码永远不会被其他人使用,我永远不会在我的应用程序中使用其他人的代码.在我的应用程序中,命名空间是不必要的添加还是学习如何使用它们是个好主意?无论如何,一个应用程序是否有一个命名空间(应用程序名称?)或每个类是否属于它自己的命名空间?

7)最后,是否有一个用于数据库连接的类,以及一个用于网络方法的类?我的应用需要两者.我认为转换我的代码以使用面向对象技术时遇到的主要问题是确定将哪些方法放在哪里,因为目前它们都在一个整体文件中.

感谢您提供的任何帮助和见解.

php oop static procedural-programming namespaces

8
推荐指数
1
解决办法
4242
查看次数

在javascript中获取下一个日期和小时

我试图在将来的特定时间点实施倒数计时器.此时间点始终是星期和小时的同一天,并且基于UTC时间.

我试图编写一个通用函数,给出一周中的一天和一小时,它将返回一个日期对象,表示将来的标准.

例子:

getNextOccuranceOfUTCDayAndHour(1, 7);

下周一上午7点到达.如果今天是星期一,即2015年5月25日@午夜UTC,那么此函数应该返回一个Date对象,表示2015年1月6日星期一上午7点UTC.

getNextOccuranceOfUTCDayAndHour(3, 13);

下周三下午1点到达.如果今天是2015年5月26日星期二@午夜UTC,那么此函数应该返回一个Date对象,代表星期三2015年5月27日星期三下午1点UTC.

我曾尝试编写一个函数来执行此操作,并且我已将下面的代码段包含在内,但它似乎只适用于某些日期,而不是其他日期.这是非常不可靠的.我宁愿不使用Moment.js.

function getNextOccuranceOfUTCDayAndHour(day, hour) {
  d = new Date();
  d.setDate(d.getUTCDate() + (7 + day - d.getUTCDay()) % 7)
  d.setUTCHours(hour, 0, 0, 0);
  return d;
}

function format_seconds(t) {
  var d = Math.floor(t / 86400);
  var h = Math.floor(t % 86400 / 3600);
  var m = Math.floor(t % 3600 / 60);
  var s = Math.floor(t % 3600 % 60);
  return ((d > 0 ? d + " d. " : "") + …
Run Code Online (Sandbox Code Playgroud)

javascript date

6
推荐指数
1
解决办法
677
查看次数