Issues (22)

Security Analysis    no request data  

This project does not seem to handle request data directly as such no vulnerable execution paths were found.

  Cross-Site Scripting
Cross-Site Scripting enables an attacker to inject code into the response of a web-request that is viewed by other users. It can for example be used to bypass access controls, or even to take over other users' accounts.
  File Exposure
File Exposure allows an attacker to gain access to local files that he should not be able to access. These files can for example include database credentials, or other configuration files.
  File Manipulation
File Manipulation enables an attacker to write custom data to files. This potentially leads to injection of arbitrary code on the server.
  Object Injection
Object Injection enables an attacker to inject an object into PHP code, and can lead to arbitrary code execution, file exposure, or file manipulation attacks.
  Code Injection
Code Injection enables an attacker to execute arbitrary code on the server.
  Response Splitting
Response Splitting can be used to send arbitrary responses.
  File Inclusion
File Inclusion enables an attacker to inject custom files into PHP's file loading mechanism, either explicitly passed to include, or for example via PHP's auto-loading mechanism.
  Command Injection
Command Injection enables an attacker to inject a shell command that is execute with the privileges of the web-server. This can be used to expose sensitive data, or gain access of your server.
  SQL Injection
SQL Injection enables an attacker to execute arbitrary SQL code on your database server gaining access to user data, or manipulating user data.
  XPath Injection
XPath Injection enables an attacker to modify the parts of XML document that are read. If that XML document is for example used for authentication, this can lead to further vulnerabilities similar to SQL Injection.
  LDAP Injection
LDAP Injection enables an attacker to inject LDAP statements potentially granting permission to run unauthorized queries, or modify content inside the LDAP tree.
  Header Injection
  Other Vulnerability
This category comprises other attack vectors such as manipulating the PHP runtime, loading custom extensions, freezing the runtime, or similar.
  Regex Injection
Regex Injection enables an attacker to execute arbitrary code in your PHP process.
  XML Injection
XML Injection enables an attacker to read files on your local filesystem including configuration files, or can be abused to freeze your web-server process.
  Variable Injection
Variable Injection enables an attacker to overwrite program variables with custom data, and can lead to further vulnerabilities.
Unfortunately, the security analysis is currently not available for your project. If you are a non-commercial open-source project, please contact support to gain access.

src/DateTime.php (18 issues)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
/**
3
 * Part of the Joomla Framework DateTime Package
4
 *
5
 * @copyright  Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved.
6
 * @license    GNU Lesser General Public License version 2.1 or later; see LICENSE
7
 */
8
9
namespace Joomla\DateTime;
10
11
/**
12
 * DateTime.
13
 *
14
 * @since  2.0.0
15
 *
16
 * @property-read  string   $daysinmonth  t - Number of days in the given month.
17
 * @property-read  string   $dayofweek    N - ISO-8601 numeric representation of the day of the week.
18
 * @property-read  string   $dayofyear    z - The day of the year (starting from 0).
19
 * @property-read  boolean  $isleapyear   L - Whether it's a leap year.
20
 * @property-read  string   $day          d - Day of the month, 2 digits with leading zeros.
21
 * @property-read  string   $hour         H - 24-hour format of an hour with leading zeros.
22
 * @property-read  string   $minute       i - Minutes with leading zeros.
23
 * @property-read  string   $second       s - Seconds with leading zeros.
24
 * @property-read  string   $month        m - Numeric representation of a month, with leading zeros.
25
 * @property-read  string   $ordinal      S - English ordinal suffix for the day of the month, 2 characters.
26
 * @property-read  string   $week         W - Numeric representation of the day of the week.
27
 * @property-read  string   $year         Y - A full numeric representation of a year, 4 digits.
28
 */
29
class DateTime
30
{
31
	/**
32
	 * Getter Interface
33
	 *
34
	 * @var    Getter\GetterInterface
35
	 * @since  2.0.0
36
	 */
37
	private static $getter;
38
39
	/**
40
	 * Parser Interface
41
	 *
42
	 * @var    Parser\ParserInterface
43
	 * @since  2.0.0
44
	 */
45
	private static $parser;
46
47
	/**
48
	 * Since Interface
49
	 *
50
	 * @var    Since\SinceInterface
51
	 * @since  2.0.0
52
	 */
53
	private static $since;
54
55
	/**
56
	 * Translator object
57
	 *
58
	 * @var    Translator\AbstractTranslator
59
	 * @since  2.0.0
60
	 */
61
	private static $translator;
62
63
	/**
64
	 * Strategy Interface
65
	 *
66
	 * @var    Strategy\StrategyInterface
67
	 * @since  2.0.0
68
	 */
69
	private $strategy;
70
71
	/**
72
	 * PHP DateTime object
73
	 *
74
	 * @var    \DateTime
75
	 * @since  2.0.0
76
	 */
77
	private $datetime;
78
79
	/**
80
	 * Constructor.
81
	 *
82
	 * @param   mixed          $datetime  Either a Joomla\Date object, a PHP DateTime object
83
	 *                                    or a string in a format accepted by strtotime().
84
	 * @param   \DateTimeZone  $timezone  The timezone.
85
	 *
86
	 * @since   2.0.0
87
	 */
88 210
	public function __construct($datetime, \DateTimeZone $timezone = null)
89
	{
90 210
		if ($datetime instanceof \DateTime)
91 210
		{
92 198
			$this->datetime = clone $datetime;
93 198
		}
94 48
		elseif ($datetime instanceof Date)
95
		{
96 19
			$this->datetime = $datetime->getDateTime();
97 19
		}
98
		else
99
		{
100 36
			$this->datetime = new \DateTime($datetime);
101
		}
102
103 210
		if (!is_null($timezone))
104 210
		{
105 1
			$this->datetime->setTimezone($timezone);
106 1
		}
107 210
	}
108
109
	/**
110
	 * Parses to DateTime object.
111
	 *
112
	 * @param   string  $name   Name of the parser.
113
	 * @param   mixed   $value  The value to parse.
114
	 *
115
	 * @return  DateTime
116
	 *
117
	 * @since   2.0.0
118
	 */
119 4
	public static function parse($name, $value)
120
	{
121 4
		return static::getParser()->parse($name, $value);
0 ignored issues
show
Since getParser() is declared private, calling it with static will lead to errors in possible sub-classes. You can either use self, or increase the visibility of getParser() to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static function getTemperature() {
        return "3422 °C";
}

public static function getSomeVariable()
{
    return static::getTemperature();
}

}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass {
      private static function getTemperature() {
        return "-182 °C";
    }
}

print YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class YourClass
{
    private static function getTemperature() {
        return "3422 °C";
    }

    public static function getSomeVariable()
    {
        return self::getTemperature();
    }
}
Loading history...
122
	}
123
124
	/**
125
	 * Creates a DateTime object from the given format.
126
	 *
127
	 * @param   string         $format    Format accepted by date().
128
	 * @param   string         $time      String representing the time.
129
	 * @param   \DateTimeZone  $timezone  The timezone.
130
	 *
131
	 * @return  DateTime
132
	 *
133
	 * @since   2.0.0
134
	 */
135 37
	public static function createFromFormat($format, $time, \DateTimeZone $timezone = null)
136
	{
137 37
		$datetime = is_null($timezone) ? \DateTime::createFromFormat($format, $time) : \DateTime::createFromFormat($format, $time, $timezone);
138
139 37
		return new static($datetime);
140
	}
141
142
	/**
143
	 * Creates a DateTime object.
144
	 *
145
	 * @param   integer        $year      The year.
146
	 * @param   integer        $month     The month.
147
	 * @param   integer        $day       The day of the month.
148
	 * @param   integer        $hour      The hour.
149
	 * @param   integer        $minute    The minute.
150
	 * @param   integer        $second    The second.
151
	 * @param   \DateTimeZone  $timezone  The timezone.
152
	 *
153
	 * @return  DateTime
154
	 *
155
	 * @since   2.0.0
156
	 */
157 37
	public static function create($year, $month = '01', $day = '01', $hour = '00', $minute = '00', $second = '00', \DateTimeZone $timezone = null)
158
	{
159 37
		$time = sprintf('%04s-%02s-%02s %02s:%02s:%02s', $year, $month, $day, $hour, $minute, $second);
160
161 37
		return static::createFromFormat('Y-m-d H:i:s', $time, $timezone);
162
	}
163
164
	/**
165
	 * Creates a DateTime object with time of the midnight.
166
	 *
167
	 * @param   integer        $year      The year.
168
	 * @param   integer        $month     The month.
169
	 * @param   integer        $day       The day of the month.
170
	 * @param   \DateTimeZone  $timezone  The timezone.
171
	 *
172
	 * @return  DateTime
173
	 *
174
	 * @since   2.0.0
175
	 */
176 26
	public static function createFromDate($year, $month = '01', $day = '01', \DateTimeZone $timezone = null)
177
	{
178 26
		return static::create($year, $month, $day, '00', '00', '00', $timezone);
179
	}
180
181
	/**
182
	 * Creates a DateTime object with date of today.
183
	 *
184
	 * @param   integer        $hour      The hour.
185
	 * @param   integer        $minute    The minute.
186
	 * @param   integer        $second    The second.
187
	 * @param   \DateTimeZone  $timezone  The timezone.
188
	 *
189
	 * @return  DateTime
190
	 *
191
	 * @since   2.0.0
192
	 */
193 5
	public static function createFromTime($hour = '00', $minute = '00', $second = '00', \DateTimeZone $timezone = null)
194
	{
195 5
		return static::create(date('Y'), date('m'), date('d'), $hour, $minute, $second, $timezone);
196
	}
197
198
	/**
199
	 * Creates a DateTime object which represents now.
200
	 *
201
	 * @param   \DateTimeZone  $timezone  The timezone.
202
	 *
203
	 * @return  DateTime
204
	 *
205
	 * @since   2.0.0
206
	 */
207 2
	public static function now(\DateTimeZone $timezone = null)
208
	{
209 2
		return static::createFromTime(date('H'), date('i'), date('s'), $timezone);
210
	}
211
212
	/**
213
	 * Creates a DateTime object which represents today.
214
	 *
215
	 * @param   \DateTimeZone  $timezone  The timezone.
216
	 *
217
	 * @return  DateTime
218
	 *
219
	 * @since   2.0.0
220
	 */
221 23
	public static function today(\DateTimeZone $timezone = null)
222
	{
223 23
		return static::createFromDate(date('Y'), date('m'), date('d'), $timezone);
224
	}
225
226
	/**
227
	 * Creates a DateTime object which represents tomorrow.
228
	 *
229
	 * @param   \DateTimeZone  $timezone  The timezone.
230
	 *
231
	 * @return  DateTime
232
	 *
233
	 * @since   2.0.0
234
	 */
235 11
	public static function tomorrow(\DateTimeZone $timezone = null)
236
	{
237 11
		$today = static::today($timezone);
238
239 11
		return $today->addDays(1);
240
	}
241
242
	/**
243
	 * Creates a DateTime object which represents yesterday.
244
	 *
245
	 * @param   \DateTimeZone  $timezone  The timezone.
246
	 *
247
	 * @return  DateTime
248
	 *
249
	 * @since   2.0.0
250
	 */
251 11
	public static function yesterday(\DateTimeZone $timezone = null)
252
	{
253 11
		$today = static::today($timezone);
254
255 11
		return $today->subDays(1);
256
	}
257
258
	/**
259
	 * Checks if the current date is after the date given as parameter.
260
	 *
261
	 * @param   DateTime  $datetime  The date to compare to.
262
	 *
263
	 * @return  boolean
264
	 *
265
	 * @since   2.0.0
266
	 */
267 224
	public function isAfter(DateTime $datetime)
268
	{
269 224
		return $this->datetime > $datetime->datetime;
270
	}
271
272
	/**
273
	 * Checks if the current date is before the date given as parameter.
274
	 *
275
	 * @param   DateTime  $datetime  The date to compare to.
276
	 *
277
	 * @return  boolean
278
	 *
279
	 * @since   2.0.0
280
	 */
281 96
	public function isBefore(DateTime $datetime)
282
	{
283 96
		return $this->datetime < $datetime->datetime;
284
	}
285
286
	/**
287
	 * Checks if the current date is equals to the date given as parameter.
288
	 *
289
	 * @param   DateTime  $datetime  The date to compare to.
290
	 *
291
	 * @return  boolean
292
	 *
293
	 * @since   2.0.0
294
	 */
295 18
	public function equals(DateTime $datetime)
296
	{
297 18
		return $this->datetime == $datetime->datetime;
298
	}
299
300
	/**
301
	 * Returns the difference between two objects.
302
	 *
303
	 * @param   DateTime  $datetime  The date to compare to.
304
	 * @param   boolean   $absolute  Should the interval be forced to be positive?
305
	 *
306
	 * @return  DateInterval
307
	 *
308
	 * @since   2.0.0
309
	 */
310 144
	public function diff(DateTime $datetime, $absolute = false)
311
	{
312 144
		return new DateInterval($this->datetime->diff($datetime->datetime, $absolute));
313
	}
314
315
	/**
316
	 * Returns a new DateTime object by adding an interval to the current one.
317
	 *
318
	 * @param   DateInterval  $interval  The interval to be added.
319
	 *
320
	 * @return  DateTime
321
	 *
322
	 * @since   2.0.0
323
	 */
324 101
	public function add(DateInterval $interval)
325
	{
326 101
		return $this->modify(
327
			function (\DateTime $datetime) use ($interval)
328
			{
329 101
				$datetime->add($interval->getDateInterval());
330 101
			}
331 101
		);
332
	}
333
334
	/**
335
	 * Returns a new DateTime object by subtracting an interval from the current one.
336
	 *
337
	 * @param   DateInterval  $interval  The interval to be subtracted.
338
	 *
339
	 * @return  DateTime
340
	 *
341
	 * @since   2.0.0
342
	 */
343 97
	public function sub(DateInterval $interval)
344
	{
345 97
		return $this->modify(
346 97
			function (\DateTime $datetime) use ($interval)
347
			{
348 97
				$datetime->sub($interval->getDateInterval());
349 97
			}
350 97
		);
351
	}
352
353
	/**
354
	 * Returns a new DateTime object by adding the specified number of days to the current one.
355
	 *
356
	 * @param   integer  $value  Number of days to be added.
357
	 *
358
	 * @return  DateTime
359
	 *
360
	 * @since   2.0.0
361
	 */
362 35
	public function addDays($value)
363
	{
364 35
		return $this->calc($value, 'P%dD');
365
	}
366
367
	/**
368
	 * Returns a new DateTime object by subtracting the specified number of days from the current one.
369
	 *
370
	 * @param   integer  $value  Number of days to be subtracted.
371
	 *
372
	 * @return  DateTime
373
	 *
374
	 * @since   2.0.0
375
	 */
376 19
	public function subDays($value)
377
	{
378 19
		return $this->addDays(-intval($value));
379
	}
380
381
	/**
382
	 * Returns a new DateTime object by adding the specified number of weeks to the current one.
383
	 *
384
	 * @param   integer  $value  Number of weeks to be added.
385
	 *
386
	 * @return  DateTime
387
	 *
388
	 * @since   2.0.0
389
	 */
390 16
	public function addWeeks($value)
391
	{
392 16
		return $this->calc($value, 'P%dW');
393
	}
394
395
	/**
396
	 * Returns a new DateTime object by subtracting the specified number of weeks from the current one.
397
	 *
398
	 * @param   integer  $value  Number of weeks to be subtracted.
399
	 *
400
	 * @return  DateTime
401
	 *
402
	 * @since   2.0.0
403
	 */
404 8
	public function subWeeks($value)
405
	{
406 8
		return $this->addWeeks(-intval($value));
407
	}
408
409
	/**
410
	 * Returns a new DateTime object by adding the specified number of months to the current one.
411
	 *
412
	 * @param   integer  $value  Number of months to be added.
413
	 *
414
	 * @return  DateTime
415
	 *
416
	 * @since   2.0.0
417
	 */
418 48
	public function addMonths($value)
419
	{
420 48
		return $this->fixMonth($this->calc($value, 'P%dM'));
421
	}
422
423
	/**
424
	 * Returns a new DateTime object by subtracting the specified number of months from the current one.
425
	 *
426
	 * @param   integer  $value  Number of months to be subtracted.
427
	 *
428
	 * @return  DateTime
429
	 *
430
	 * @since   2.0.0
431
	 */
432 34
	public function subMonths($value)
433
	{
434 34
		return $this->addMonths(-intval($value));
435
	}
436
437
	/**
438
	 * Returns a new DateTime object by adding the specified number of years to the current one.
439
	 *
440
	 * @param   integer  $value  Number of years to be added.
441
	 *
442
	 * @return  DateTime
443
	 *
444
	 * @since   2.0.0
445
	 */
446 16
	public function addYears($value)
447
	{
448 16
		return $this->fixMonth($this->calc($value, 'P%dY'));
449
	}
450
451
	/**
452
	 * Returns a new DateTime object by subtracting the specified number of years from the current one.
453
	 *
454
	 * @param   integer  $value  Number of years to be subtracted.
455
	 *
456
	 * @return  DateTime
457
	 *
458
	 * @since   2.0.0
459
	 */
460 8
	public function subYears($value)
461
	{
462 8
		return $this->addYears(-intval($value));
463
	}
464
465
	/**
466
	 * Returns a new DateTime object by adding the specified number of seconds to the current one.
467
	 *
468
	 * @param   integer  $value  Number of seconds to be added.
469
	 *
470
	 * @return  DateTime
471
	 *
472
	 * @since   2.0.0
473
	 */
474 8
	public function addSeconds($value)
475
	{
476 8
		return $this->calc($value, 'PT%dS');
477
	}
478
479
	/**
480
	 * Returns a new DateTime object by subtracting the specified number of seconds from the current one.
481
	 *
482
	 * @param   integer  $value  Number of seconds to be subtracted.
483
	 *
484
	 * @return  DateTime
485
	 *
486
	 * @since   2.0.0
487
	 */
488 4
	public function subSeconds($value)
489
	{
490 4
		return $this->addSeconds(-intval($value));
491
	}
492
493
	/**
494
	 * Returns a new DateTime object by adding the specified number of minutes to the current one.
495
	 *
496
	 * @param   integer  $value  Number of minutes to be added.
497
	 *
498
	 * @return  DateTime
499
	 *
500
	 * @since   2.0.0
501
	 */
502 8
	public function addMinutes($value)
503
	{
504 8
		return $this->calc($value, 'PT%dM');
505
	}
506
507
	/**
508
	 * Returns a new DateTime object by subtracting the specified number of minutes from the current one.
509
	 *
510
	 * @param   integer  $value  Number of minutes to be subtracted.
511
	 *
512
	 * @return  DateTime
513
	 *
514
	 * @since   2.0.0
515
	 */
516 4
	public function subMinutes($value)
517
	{
518 4
		return $this->addMinutes(-intval($value));
519
	}
520
521
	/**
522
	 * Returns a new DateTime object by adding the specified number of hours to the current one.
523
	 *
524
	 * @param   integer  $value  Number of hours to be added.
525
	 *
526
	 * @return  DateTime
527
	 *
528
	 * @since   2.0.0
529
	 */
530 8
	public function addHours($value)
531
	{
532 8
		return $this->calc($value, 'PT%dH');
533
	}
534
535
	/**
536
	 * Returns a new DateTime object by subtracting the specified number of hours from the current one.
537
	 *
538
	 * @param   integer  $value  Number of hours to be subtracted.
539
	 *
540
	 * @return  DateTime
541
	 *
542
	 * @since   2.0.0
543
	 */
544 4
	public function subHours($value)
545
	{
546 4
		return $this->addHours(-intval($value));
547
	}
548
549
	/**
550
	 * Returns a new DateTime object representing the start of the current day.
551
	 *
552
	 * @return  DateTime
553
	 *
554
	 * @since   2.0.0
555
	 */
556 74
	public function startOfDay()
557
	{
558 74
		return $this->modify(array($this->getStrategy(), 'startOfDay'));
559
	}
560
561
	/**
562
	 * Returns a new DateTime object representing the end of the current day.
563
	 *
564
	 * @return  DateTime
565
	 *
566
	 * @since   2.0.0
567
	 */
568 7
	public function endOfDay()
569
	{
570 7
		return $this->modify(array($this->getStrategy(), 'endOfDay'));
571
	}
572
573
	/**
574
	 * Returns a new DateTime object representing the start of the current week.
575
	 *
576
	 * @return  DateTime
577
	 *
578
	 * @since   2.0.0
579
	 */
580 2
	public function startOfWeek()
581
	{
582 2
		$startOfDay = $this->startOfDay();
583
584 2
		return $startOfDay->modify(array($this->getStrategy(), 'startOfWeek'));
585
	}
586
587
	/**
588
	 * Returns a new DateTime object representing the end of the current week.
589
	 *
590
	 * @return  DateTime
591
	 *
592
	 * @since   2.0.0
593
	 */
594 2
	public function endOfWeek()
595
	{
596 2
		$endOfDay = $this->endOfDay();
597
598 2
		return $endOfDay->modify(array($this->getStrategy(), 'endOfWeek'));
599
	}
600
601
	/**
602
	 * Returns a new DateTime object representing the start of the current month.
603
	 *
604
	 * @return  DateTime
605
	 *
606
	 * @since   2.0.0
607
	 */
608 2
	public function startOfMonth()
609
	{
610 2
		$startOfDay = $this->startOfDay();
611
612 2
		return $startOfDay->modify(array($this->getStrategy(), 'startOfMonth'));
613
	}
614
615
	/**
616
	 * Returns a new DateTime object representing the end of the current month.
617
	 *
618
	 * @return  DateTime
619
	 *
620
	 * @since   2.0.0
621
	 */
622 2
	public function endOfMonth()
623
	{
624 2
		$endOfDay = $this->endOfDay();
625
626 2
		return $endOfDay->modify(array($this->getStrategy(), 'endOfMonth'));
627
	}
628
629
	/**
630
	 * Returns a new DateTime object representing the start of the current year.
631
	 *
632
	 * @return  DateTime
633
	 *
634
	 * @since   2.0.0
635
	 */
636 2
	public function startOfYear()
637
	{
638 2
		$startOfDay = $this->startOfDay();
639
640 2
		return $startOfDay->modify(array($this->getStrategy(), 'startOfYear'));
641
	}
642
643
	/**
644
	 * Returns a new DateTime object representing the end of the current year.
645
	 *
646
	 * @return  DateTime
647
	 *
648
	 * @since   2.0.0
649
	 */
650 2
	public function endOfYear()
651
	{
652 2
		$endOfDay = $this->endOfDay();
653
654 2
		return $endOfDay->modify(array($this->getStrategy(), 'endOfYear'));
655
	}
656
657
	/**
658
	 * Returns date formatted according to given format.
659
	 *
660
	 * @param   string  $format  Format accepted by date().
661
	 *
662
	 * @return  string
663
	 *
664
	 * @since   2.0.0
665
	 */
666 88
	public function format($format)
667
	{
668 88
		$replace = array();
669
670
		// Loop all format characters and check if we can translate them.
671 88
		for ($i = 0; $i < strlen($format); $i++)
672
		{
673 88
			$character = $format[$i];
674
675
			// Check if we can replace it with a translated version.
676 88
			if (in_array($character, array('D', 'l', 'F', 'M')))
677 88
			{
678
				switch ($character)
679
				{
680 2
					case 'D':
681 1
						$key = $this->datetime->format('l');
682 1
						break;
683 2
					case 'M':
684 1
						$key = $this->datetime->format('F');
685 1
						break;
686 2
					default:
687 2
						$key = $this->datetime->format($character);
688 2
				}
689
690 2
				$original = $this->datetime->format($character);
691 2
				$translated = $this->getTranslator()->get(strtolower($key));
692
693
				// Short notations.
694 2
				if (in_array($character, array('D', 'M')))
695 2
				{
696 2
					$translated = substr($translated, 0, 3);
697 2
				}
698
699
				// Add to replace list.
700 2
				if ($translated && $original != $translated)
701 2
				{
702 2
					$replace[$original] = $translated;
703 2
				}
704 2
			}
705 88
		}
706
707
		// Replace translations.
708
		if ($replace)
0 ignored issues
show
Bug Best Practice introduced by
The expression $replace of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
709 88
		{
710 2
			return str_replace(array_keys($replace), array_values($replace), $this->datetime->format($format));
711
		}
712
713 88
		return $this->datetime->format($format);
714
	}
715
716
	/**
717
	 * Returns the difference in a human readable format.
718
	 *
719
	 * @param   DateTime  $datetime     The date to compare to. Default is null and this means that
720
	 *                                   the current object will be compared to the current time.
721
	 * @param   integer   $detailLevel  How much details do you want to get.
722
	 *
723
	 * @return  string
724
	 *
725
	 * @since   2.0.0
726
	 */
727 121
	public function since(DateTime $datetime = null, $detailLevel = 1)
728
	{
729 121
		return $this->getSince()->since($this, $datetime, $detailLevel);
730
	}
731
732
	/**
733
	 * Returns the almost difference in a human readable format.
734
	 *
735
	 * @param   DateTime  $datetime  The date to compare to. Default is null and this means that
736
	 *                                the current object will be compared to the current time.
737
	 *
738
	 * @return  string
739
	 *
740
	 * @since   2.0.0
741
	 */
742 22
	public function sinceAlmost(DateTime $datetime = null)
743
	{
744 22
		return $this->getSince()->almost($this, $datetime);
745
	}
746
747
	/**
748
	 * Magic method to access properties of the date given by class to the format method.
749
	 *
750
	 * @param   string  $name  The name of the property.
751
	 *
752
	 * @return  mixed
753
	 *
754
	 * @since   2.0.0
755
	 */
756 30
	public function __get($name)
757
	{
758 30
		return $this->getGetter()->get($this, $name);
759
	}
760
761
	/**
762
	 * Alias for __get.
763
	 *
764
	 * @param   string  $name  The name of the property.
765
	 *
766
	 * @return  mixed
767
	 *
768
	 * @since   2.0.0
769
	 */
770 14
	public function get($name)
771
	{
772 14
		return $this->$name;
773
	}
774
775
	/**
776
	 * Returns the timezone offset.
777
	 *
778
	 * @return  integer
779
	 *
780
	 * @since   2.0.0
781
	 */
782 2
	public function getOffset()
783
	{
784 2
		return $this->datetime->getOffset();
785
	}
786
787
	/**
788
	 * Returns the Unix timestamp representing the date.
789
	 *
790
	 * @return  integer
791
	 *
792
	 * @since   2.0.0
793
	 */
794 1
	public function getTimestamp()
795
	{
796 1
		return $this->datetime->getTimestamp();
797
	}
798
799
	/**
800
	 * Returns a DateTimeZone object.
801
	 *
802
	 * @return  \DateTimeZone
803
	 *
804
	 * @since   2.0.0
805
	 */
806 1
	public function getTimezone()
807
	{
808 1
		return $this->datetime->getTimezone();
809
	}
810
811
	/**
812
	 * Returns a PHP DateTime object.
813
	 *
814
	 * @return  \DateTime
815
	 *
816
	 * @since   2.0.0
817
	 */
818 20
	public function getDateTime()
819
	{
820 20
		return clone $this->datetime;
821
	}
822
823
	/**
824
	 * Sets the Since implementation.
825
	 *
826
	 * @param   Since\SinceInterface  $since  The Since implementation.
827
	 *
828
	 * @return  void
829
	 *
830
	 * @since   2.0.0
831
	 */
832
	public static function setSince(Since\SinceInterface $since)
833
	{
834
		static::$since = $since;
0 ignored issues
show
Since $since is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $since to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
835
	}
836
837
	/**
838
	 * Sets the Translator implementation.
839
	 *
840
	 * @param   Translator\AbstractTranslator  $translator  The Translator implementation.
841
	 *
842
	 * @return  void
843
	 *
844
	 * @since   2.0.0
845
	 */
846
	public static function setTranslator(Translator\AbstractTranslator $translator)
847
	{
848
		static::$translator = $translator;
0 ignored issues
show
Since $translator is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $translator to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
849
	}
850
851
	/**
852
	 * Sets the Getter implementation.
853
	 *
854
	 * @param   Getter\GetterInterface  $getter  The Getter implementation.
855
	 *
856
	 * @return  void
857
	 *
858
	 * @since   2.0.0
859
	 */
860 15
	public static function setGetter(Getter\GetterInterface $getter)
861
	{
862 15
		static::$getter = $getter;
0 ignored issues
show
Since $getter is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $getter to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
863 15
	}
864
865
	/**
866
	 * Sets the Parser implementation.
867
	 *
868
	 * @param   Parser\ParserInterface  $parser  The Parser implementation.
869
	 *
870
	 * @return  void
871
	 *
872
	 * @since   2.0.0
873
	 */
874 3
	public static function setParser(Parser\ParserInterface $parser)
875
	{
876 3
		static::$parser = $parser;
0 ignored issues
show
Since $parser is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $parser to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
877 3
	}
878
879
	/**
880
	 * Sets the locale.
881
	 *
882
	 * @param   string  $locale  The locale to set.
883
	 *
884
	 * @return  void
885
	 *
886
	 * @since   2.0.0
887
	 */
888 279
	public static function setLocale($locale)
889
	{
890 279
		static::getTranslator()->setLocale($locale);
891 279
	}
892
893
	/**
894
	 * Gets the Translator implementation.
895
	 *
896
	 * @return  Translator\AbstractTranslator
897
	 *
898
	 * @since   2.0.0
899
	 */
900 281
	public static function getTranslator()
901
	{
902 281
		if (is_null(static::$translator))
0 ignored issues
show
Since $translator is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $translator to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
903 281
		{
904 1
			static::$translator = new Translator\DateTimeTranslator;
0 ignored issues
show
Since $translator is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $translator to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
905 1
		}
906
907 281
		return static::$translator;
0 ignored issues
show
Since $translator is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $translator to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
908
	}
909
910
	/**
911
	 * Sets the Strategy implementation.
912
	 *
913
	 * @param   Strategy\StrategyInterface  $strategy  The Strategy implementation.
914
	 *
915
	 * @return  void
916
	 *
917
	 * @since   2.0.0
918
	 */
919
	protected function setStrategy(Strategy\StrategyInterface $strategy)
920
	{
921
		$this->strategy = $strategy;
922
	}
923
924
	/**
925
	 * Gets the Strategy implementation.
926
	 *
927
	 * @return  Strategy\StrategyInterface
928
	 *
929
	 * @since   2.0.0
930
	 */
931 78
	protected function getStrategy()
932
	{
933 78
		if (is_null($this->strategy))
934 78
		{
935 78
			$this->strategy = new Strategy\DateTimeStrategy;
936 78
		}
937
938 78
		return $this->strategy;
939
	}
940
941
	/**
942
	 * Creates a DateTime by adding or subtacting interval.
943
	 *
944
	 * @param   integer  $value   The value for the format.
945
	 * @param   string   $format  The interval_spec for sprintf(), eg. 'P%sD'.
946
	 *
947
	 * @return  DateTime
948
	 *
949
	 * @since   2.0.0
950
	 */
951 131
	private function calc($value, $format)
952
	{
953 131
		$value = intval($value);
954 131
		$spec = sprintf($format, abs($value));
955
956 131
		return $value > 0 ? $this->add(new DateInterval($spec)) : $this->sub(new DateInterval($spec));
957
	}
958
959
	/**
960
	 * Creates a DateTime object by calling the given callable.
961
	 *
962
	 * @param   callable  $callable  The callable with modifications of PHP DateTime object.
963
	 *
964
	 * @return  DateTime
965
	 *
966
	 * @since   2.0.0
967
	 */
968 178
	private function modify($callable)
969
	{
970 178
		$datetime = clone $this->datetime;
971 178
		call_user_func_array($callable, array($datetime));
972
973 178
		return new static($datetime);
974
	}
975
976
	/**
977
	 * If a day has changed, sets the date on the last day of the previous month.
978
	 *
979
	 * @param   DateTime  $result  A result of months or years addition
980
	 *
981
	 * @return  DateTime
982
	 *
983
	 * @since   2.0.0
984
	 */
985 56
	private function fixMonth(DateTime $result)
986
	{
987 56
		if ($result->format('d') != $this->format('d'))
988 56
		{
989 20
			$result = $result->subMonths(1);
990 20
			$result->datetime->setDate($result->format('Y'), $result->format('m'), $result->format('t'));
991 20
		}
992
993 56
		return $result;
994
	}
995
996
	/**
997
	 * Gets the Since implementation.
998
	 *
999
	 * @return  Since\SinceInterface
1000
	 *
1001
	 * @since   2.0.0
1002
	 */
1003 143
	private static function getSince()
1004
	{
1005 143
		if (is_null(static::$since))
0 ignored issues
show
Since $since is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $since to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
1006 143
		{
1007 1
			static::$since = new Since\DateTimeSince;
0 ignored issues
show
Since $since is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $since to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
1008 1
		}
1009
1010 143
		return static::$since;
0 ignored issues
show
Since $since is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $since to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
1011
	}
1012
1013
	/**
1014
	 * Gets the Getter implementation.
1015
	 *
1016
	 * @return  Getter\GetterInterface
1017
	 *
1018
	 * @since   2.0.0
1019
	 */
1020 30
	private static function getGetter()
1021
	{
1022 30
		if (is_null(static::$getter))
0 ignored issues
show
Since $getter is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $getter to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
1023 30
		{
1024 1
			static::$getter = new Getter\DateTimeGetter;
0 ignored issues
show
Since $getter is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $getter to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
1025 1
		}
1026
1027 30
		return static::$getter;
0 ignored issues
show
Since $getter is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $getter to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
1028
	}
1029
1030
	/**
1031
	 * Gets the Parser implementation.
1032
	 *
1033
	 * @return  Parser\ParserInterface
1034
	 *
1035
	 * @since   2.0.0
1036
	 */
1037 4
	private static function getParser()
1038
	{
1039 4
		if (is_null(static::$parser))
0 ignored issues
show
Since $parser is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $parser to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
1040 4
		{
1041 1
			static::$parser = new Parser\DateTimeParser;
0 ignored issues
show
Since $parser is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $parser to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
1042 1
		}
1043
1044 4
		return static::$parser;
0 ignored issues
show
Since $parser is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $parser to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
1045
	}
1046
}
1047