On Sun, Jul 21, 2013 at 6:14 PM, Jakub Zelenka <bu...@php.net> wrote:
> On Tue, Jul 2, 2013 at 8:21 AM, Simon Schick <simonsimc...@gmail.com> wrote:
>>
>> On Fri, Jun 28, 2013 at 11:20 PM, Derick Rethans <der...@php.net> wrote:
>> >
>> > Hey Simon,
>> >
>> > PS, please don't top-reply as per mailinglist guidelines:
>> > http://us2.php.net/reST/README.MAILINGLIST_RULES
>> >
>> > On Fri, 28 Jun 2013, Simon Schick wrote:
>> > > On Fri, Jun 28, 2013 at 7:10 PM, Derick Rethans <der...@php.net>
>> > > wrote:
>> > >
>> > > > On Fri, 28 Jun 2013, Simon Schick wrote:
>> > > >
>> > > > > I'd like to extend the API of php by a method.
>> > > >
>> > > > Great, let me know if you need any help with the implementation, or
>> > > > when you have any questions on how it currently works.
>> > >
>> > > Sorry - I that was easy to missunderstand ;) I thought of providing
>> > > the idea. But I would happily also try to implement it by my own -
>> > > just to also have contributed to the php-core. If you could give me a
>> > > hint where to start - I feel quite lost in the code right now ... even
>> > > so I read the great tutorials about php-internals provided by Anthony
>> > > Ferrara.
>> > >
>> > > And this may take some time! I've just started with C/C++.
>> > >
>> > > Do you think this is an easy task to start? Depending on knowledge of
>> > > php-internals ;)
>> >
>> > It's not that difficult, but not the easiest thing either. Basically,
>> > you have to do the following steps:
>> >
>> > 1. in ext/date/lib/interval.c add a function that has two arguments of
>> >    the timelib_rel_time* type. It should return a *new*
>> >    timelib_rel_time* structure that has the two intervals added up
>> >    together. It shouldn't change either of the original
>> >    timelib_rel_time* arguments. Add the function definition to
>> >    ext/date/lib/timelib.h too.
>> > 2. You can only add two timelib_rel_time* arguments if neither of
>> >    first_last_day_of, special, have_weekday_relative, and
>> >    have_special_relative are set. You can'd add a "first day of next
>> >    month" to a "+5 days" interval - it only works for simple y:m:d h:i:s
>> >    intervals.
>> > 3. In ext/date/php_date.c add:
>> >
>> >    a. a new ARG_INFO struct after the one for
>> >       arginfo_date_interval_construct,
>> >    b. Add a new method, "add" after
>> >       PHP_ME_MAPPING(createFromDateString,
>> > date_interval_create_from_date_string,...
>> >    c. Add a new PHP_FUNCTION(date_interval_add) after the function
>> >       PHP_FUNCTION(date_interval_format) that takes two DateInterval
>> >       objects, extract the timelib_rel_time information, call the new
>> >       function that you've added in step 1, and replace the
>> >       timelib_rel_time* that is part of the DateInterval object with the
>> >       returned value.
>> >    d. Add a forwards declaration to php_date.h after
>> >       PHP_FUNCTION(date_interval_create_from_date_string);
>> >
>> > 4. Make sure that the function can be called both as a procedural way
>> >    (date_interval_add) and an object oriented way (DateInterval->add()).
>> >
>> > 5. Write test cases and put them in ext/date/tests.
>> >
>> > That's what I can think off right now.
>> >
>> > cheers,
>> > Derick
>> >
>> >
>> >
>> > --
>> > http://derickrethans.nl | http://xdebug.org
>> > Like Xdebug? Consider a donation: http://xdebug.org/donate.php
>> > twitter: @derickr and @xdebug
>> > Posted with an email client that doesn't mangle email: alpine
>>
>> Hi, Derick
>>
>> I thought a bit about the changes here and came up with the following
>> feedback:
>>
>> If I can't add intervals where either one is relative, I'd also add a
>> method isRelative() to the class, where the user can check if it's a
>> relative interval.
>> But anyways - what happens if the interval is relative and you try to
>> access one of the public properties? They're all designed for static
>> intervals (let's say +5days), right?
>>
>> What, if the user tries to add a relative to a fixed interval? Should
>> I trigger a E_WARNING, because it's no breaking error, but the value
>> can't be calculated?
>>
>>
>> Bye,
>> Simon
>>
>> --
>> PHP Internals - PHP Runtime Development Mailing List
>> To unsubscribe, visit: http://www.php.net/unsub.php
>>
>
>
> Hi,
>
>
> here is the patch: https://github.com/php/php-src/pull/390
>
> It's basically what Derick suggested. However there is one issue that needs
> to be resolved - interval normalization (timelib_do_rel_normalize). The
> problem is that currently there is no way how to get a base timelib_time
> from the interval. It means that it's not possible to find out how many days
> use for normalization. For example if interval1 is 20 days and interval2 is
> 21 days, then the resulted normalized interval will be 1 month and ??
> days... :)
>
> There are few solution that come to my mind:
>
> 1. no normalization (currently implemented) - this is the easiest solution
> but the result from the example will be 0 months and 41 days can give
> interval that has over 31 days...
> 2. warning if the resulted interval has more than 28 days (February :) )
> 3. save base timelib_time with the interval when created and then use it as
> a base class - it will probably require some sort of copying or ref counting
> but it seems like the most logical solution
>
> What do you think?
>
> Jakub

Hi, Jakub

Many thanks for the implementation. I haven't had the time to do it,
but would really have enjoyed it :)

Now, I'll contribute by a comment:
I think, the most valuable result would be the first option.

Reason: I can also create a date-interval for "90 days".

Here's my example:
php > var_dump(DateInterval::createFromDateString("90 days"));
class DateInterval#3 (8) {
  public $y =>
  int(0)
  public $m =>
  int(0)
  public $d =>
  int(90)
  public $h =>
  int(0)
  public $i =>
  int(0)
  public $s =>
  int(0)
  public $invert =>
  int(0)
  public $days =>
  int(0)
}

Adding or substracting some interval from this wouldn't be that
different as something like this:

php > var_dump(DateInterval::createFromDateString("90 days and -3 months"));
class DateInterval#3 (8) {
  public $y =>
  int(0)
  public $m =>
  int(-3)
  public $d =>
  int(90)
  public $h =>
  int(0)
  public $i =>
  int(0)
  public $s =>
  int(0)
  public $invert =>
  int(0)
  public $days =>
  int(0)
}

I think, we shouldn't care, as long as both intervals are not relative
(like "next monday").

Btw ... wouldn't be that hard to add a "sub()" method to the class,
substracting a DateInterval ;)

Bye
Simon

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to