Является ли использование суперглобальных элементов прямым или плохим в PHP?

Итак, я не я пришел из огромного PHP-фона, и мне было интересно, если в правильно сформированном коде нужно использовать «суперглобальные переменные» напрямую, например, в середине какой-то функции, скажем $ _ SESSION ['x'] = 'y'; или если, как я обычно делаю с переменными, лучше отправить их в качестве аргументов, которые можно использовать оттуда, например:

class Doer {
    private $sess;
    public function __construct(&$sess) {
        $this->sess =& $sess;
    }
} 

$doer = new Doer($_SESSION);

, а затем использовать версию Doer-> sess из внутри Доера и тому подобное. (Преимущество этого метода в том, что он ясно показывает, что Doer использует $ _SESSION.)

Что ' но если индекс 1 был ранее установлен, а пользователь выбирает индекс 0, то мне нужно удалить раздел 2.

Для этого у меня был установлен этот код для запуска по событию valueChanged в UISegmentedControl

 if (segmentControl.selectedSegmentIndex == 0)
 {
     self.settings.useMetric = YES;
     if ([sections containsObject:FT_AND_IN] && [sections containsObject:FRACTION_PRECISION]) {

         NSArray *indexSections = [NSArray arrayWithObjects:
             [NSIndexPath indexPathForRow:0 inSection:
                 [sections indexOfObject:FT_AND_IN]], 
             [NSIndexPath indexPathForRow:0 inSection:
                 [sections indexOfObject:FRACTION_PRECISION]], nil];
         [sections removeObject:FT_AND_IN];
         [sections removeObject:FRACTION_PRECISION];
         [self.tableView deleteRowsAtIndexPaths:indexSections
             withRowAnimation:UITableViewRowAnimationRight];
     }
 }
 else {
     self.settings.useMetric = NO;
     [sections insertObject:FT_AND_IN atIndex:1];
     [sections insertObject:FRACTION_PRECISION atIndex:2];
     NSArray *indexSections = [NSArray arrayWithObjects:
         [NSIndexPath indexPathForRow:0 inSection:
             [sections indexOfObject:FT_AND_IN]], 
         [NSIndexPath indexPathForRow:0 inSection:
             [sections indexOfObject:FRACTION_PRECISION]], nil];
     [self.tableView insertRowsAtIndexPaths:indexSections 
         withRowAnimation:UITableViewRowAnimationRight];
 }

Где NSMutableArray вызвал секции - список всех секций. Каждый раздел имеет только 1 строку, поэтому никакие вложенные массивы не требуются.

Однако при оценке остальной части я получаю эту ошибку:

*** Assertion failure in -[UITableView _endCellAnimationsWithContext:],
    /SourceCache/UIKit_Sim/UIKit-1261.5/UITableView.m:904
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException',
     reason: 'Invalid update: invalid number of sections.  The number of sections
     contained in the table view after the update (6) must be equal to the number of
     sections contained in the table view before the update (4), plus or minus the 
     number of sections inserted or deleted (0 inserted, 0 deleted).'

Я убедился, что у него было 4 раздела перед остальным, он правильно добавил два раздела к массиву section , я сказал ему правильные indexPaths для добавленных разделов. Почему это не работает?

Я попытался заменить строку [self.tableView insertRows / deleteRows ...] на [self.tableView reloadData]; , а затем она работает хорошо, Я попробовал это предложение и добавил работы, но я получаю сбой при удалении

[self.tableView beginUpdates];
if (segmentControl.selectedSegmentIndex == 0)
{
        self.settings.useMetric = YES;
    if ([sections containsObject:FT_AND_IN] && 
            [sections containsObject:FRACTION_PRECISION])
        {

        [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:
                [sections indexOfObject:FT_AND_IN]] 
                withRowAnimation:UITableViewRowAnimationRight];
        [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:
                [sections indexOfObject:FRACTION_PRECISION]] 
                withRowAnimation:UITableViewRowAnimationRight];
    }
}
else 
    {
        self.settings.useMetric = NO;
    [sections insertObject:FT_AND_IN atIndex:1];
        [sections insertObject:FRACTION_PRECISION atIndex:2];
        NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:1];
    NSIndexSet *indexSet2 = [NSIndexSet indexSetWithIndex:2];
    [self.tableView insertSections:indexSet 
            withRowAnimation:UITableViewRowAnimationRight];
    [self.tableView insertSections:indexSet2 
            withRowAnimation:UITableViewRowAnimationRight];
}
[self.tableView endUpdates];

Я получаю эту ошибку.

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -
    [NSIndexSet initWithIndexesInRange:]: Range {2147483647, 1} exceeds 
    maximum index value of NSNotFound - 1'

Объекты FT_AND_IN и FRACTION_PRECISION добавляются / удаляются только из хранилища данных в этом коде, и они являются просто const NSString объектами.

5
задан jamone 17 August 2010 в 00:07
поделиться